Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c-copy_to_user:如何在用户空间中读取内核空间的结构类型值?_C_Linux_Linux Kernel_Kernel Module - Fatal编程技术网

c-copy_to_user:如何在用户空间中读取内核空间的结构类型值?

c-copy_to_user:如何在用户空间中读取内核空间的结构类型值?,c,linux,linux-kernel,kernel-module,C,Linux,Linux Kernel,Kernel Module,我有一个内核模块,希望在其中向用户空间传递一些值。有人建议我使用struct type来传递更多的值。 在内核空间中,我有: 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 re

我有一个内核模块,希望在其中向用户空间传递一些值。有人建议我使用struct type来传递更多的值。 在内核空间中,我有:

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 );
}
在用户空间中,如何将这两个值带入数据结构? 我还想在用户空间中将数据类型声明为:

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结构数据{
瓦卢三角洲;
int val_btn_状态;
}数据;
int main(int argc,字符**argv)
{
数据挖掘;
char*app_name=argv[0];
char*dev_name=“/dev/sample”;
int-fd=-1;
如果((fd=open(dev_name,O_RDWR))<0)
{
fprintf(stderr,“%s:无法打开%s:%s\n”、应用程序名称、开发程序名称、strerror(errno));
申报表(1);
}
x=读取(fd和str,1);
返回0;
}

但我不喜欢这样,因为我不想在用户空间和内核空间上重写同一个typedef,也许这个不能工作。还有其他解决方案吗?

您可以将
公共结构
开发人员名称
添加到标题中,并包含在驱动程序和用户空间程序中

比如: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);


首先,你需要了解这个问题

在示例中,
sample\u read()
函数应该使用
char\u user*buffer
而不是
char*buffer

typedef struct data
定义放入头文件,该头文件可以包含内核模块和用户程序,而无需重新定义两次


您是否尝试过其他选项,比如将传感器的回波中断(我假设它是一个中断)标记为快速中断,这样它就不会被同一级别的其他人抢占。 或者,为什么不让它处于处理器上的最高可用中断级别(在硬编码的中断级别之下)。
正如桑托什所说,冻结的原因应该有所不同。也许你看过你的结构的排列了吗?根据您的底层处理器的字长???

谢谢您的回答。我不喜欢header(这也是一个很好的解决方案),因为在程序中我必须尽可能快,否则程序会冻结。我的程序管理一个距离传感器(HC-SR04)。这个传感器,当它收到一个至少10 us的触发信号时,它确保开始回波信号,我用它来计算测量值。在我的内核模块中,我使用write函数设置TRIGGER和read函数来读取回声的持续时间并计算距离。我担心在调用typedef时,当我声明struct(也声明为a.h)时,我会浪费时间并冻结程序添加头不会影响程序的运行时。如果你的程序冻结了,那一定是另一个问题。因为任何与头文件有关的操作都是在预处理时完成的,现在我尝试一下。在此之前,我注意到当我将typedef写入内核空间时,程序会冻结。当我删除它时,程序运行正常。但是我试着告诉你:)好的,这个程序在时间方面也能正常工作,谢谢你,桑托什。也谢谢askb。谢谢你的回答。我不喜欢header(这也是一个很好的解决方案),因为在程序中我必须尽可能快,否则程序会冻结。我的程序管理一个距离传感器(HC-SR04)。这个传感器,当它收到一个至少10 us的触发信号时,它确保开始回波信号,我用它来计算测量值。在我的内核模块中,我使用write函数设置TRIGGER和read函数来读取回声的持续时间并计算距离。我担心在调用typedef时,当我声明struct(也声明为a.h)时,我会浪费时间并冻结程序
read(fd, &str, sizeof(data_t));
unsigned long copy_to_user (    void __user * to,
    const void * from,
    unsigned long n);