我有一个内核模块,我想将一些值传递到用户空间。有人建议我使用结构类型来传递更多的值。 在内核空间我有:
typedef struct data {
int val_delta;
int val_btn_status;
}data_t;
static ssize_t sample_read(struct file *filp, char *buffer, size_t length, loff_t * offset)
{
int ret = 1;
int delta = 10;
data_t val;
val.val_btn_status = gpio_get_value( BTN );
val.val_delta = delta;
copy_to_user( buffer, &val, sizeof(data_t));
return( ret );
}
在用户空间中,如何将这两个值放入 data_t 结构中? 我还想在用户空间中将 data_t 类型声明为:
typedef struct data {
int val_delta;
int val_btn_status;
}data_t;
int main(int argc, char **argv)
{
data_t str;
char *app_name = argv[0];
char *dev_name = "/dev/sample";
int fd = -1;
if ((fd = open(dev_name, O_RDWR)) < 0)
{
fprintf(stderr, "%s: unable to open %s: %s\n", app_name, dev_name, strerror(errno));
return( 1 );
}
x = read(fd, &str, 1);
return 0;
}
但我不喜欢这个,因为我不想在用户空间和内核空间上重写相同的 typedef,也许这个不起作用。还有其他解决方案吗?
最佳答案
您可以将 common struct
和 dev_name
添加到 header 中,并包含在驱动程序和用户空间程序中。
喜欢:data.h
#ifndef DATA_H
#define DATA_H
typedef struct data {
int val_delta;
int val_btn_status;
}data_t;
#define dev_name "/dev/sample"
#endif
也改变
read(fd, &str, 1);
到
read(fd, &str, sizeof(data_t));
关于c-copy_to_user : how to read a struct type value of kernel space in the user space?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27700525/