c-copy_to_user : how to read a struct type value of kernel space in the user space?

标签 c linux linux-kernel kernel-module

我有一个内核模块,我想将一些值传递到用户空间。有人建议我使用结构类型来传递更多的值。 在内核空间我有:

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 structdev_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/

相关文章:

linux - 如何通过backgm在网络连接之前保持闪屏直到网络正常并进入youtube页面

Linux USB 调制解调器 SMS 警报

linux - 为什么在 linux 中需要连续内存分配?

c - 匹配文件中每个单词的列和行

c - 刽子手编程: unscrambling words (c programming)

c++ - 在 x86 机器上移动超过 32 位的 uint64_t 整数未定义行为?

linux - 我是否需要 "enable"Linux 3.12 驱动程序中的 PCIe 内存区域?

c - 在 C 中传输文件交付损坏的数据

c - 在 TCP 上手动选择一个接口(interface)来发送数据

C memcpy() 一个函数