如何从内核空间通过用户空间应用程序接收数据?

时间:2014-04-17 10:51:00

标签: c linux linux-kernel client-server procfs

我正在计算dev.c内核源代码中的中断时间,如下所示:

extern double InterruptTime;
InterruptTime = ktime_get_real();   //timestamp

我正在使用procfs从内核空间向用户空间写入数据,并在内核空间中使用下面的api将数据发送到用户空间。 PROCFS.c:

struct device {
double array[100];
}chr_arr;

ssize_t dev_read(struct file *filp,const char *buf,size_t count,loff_t *offset)
{
int len;
chr_arr.array =InterruptTime;         // Is this possible ??
len = count >= strlen(chr_arr.array) ? strlen(chr_arr.array) : count;
*offset += len; 
    if (*offset >= strlen(chr_arr.array))
        return 0;

    if (copy_to_user(buf,chr_arr.array,len))
        return -EFAULT;

    return len;
}

是否可以从PROCFS.c中的dev.c读取InterruptTime,如上所示? 如何在用户端接收从上面的内核代码发送的数据(即InterruptTime)??

1 个答案:

答案 0 :(得分:0)

我还不太确定,您是否只需提供InterruptTime的单个值,或者是否需要缓存这些值,因为它们是为用户空间代码生成的,以便稍后检索。如果没有额外的缓冲和简单的努力,我会提出一些建议:

ssize_t dev_read(struct file *filp,const char *buf,size_t count,loff_t *offset)
{

  if ( count < sizeof(InterruptTime) ) {
    // Not enough space provided.
    return 0; // Or some error code maybe.
  }

  if (copy_to_user(buf,&InterruptTime,sizeof(InterruptTime)) {
    return -EFAULT;
  } else {
    return sizeof(InterruptTime); // Number of bytes we copied.
  }

}

(请注意,这不是很干净,应该通过缓冲数据来改进,以允许读取任意大小,正确的错误处理,&amp; c。)

然后,在用户空间中,您可以执行类似

的操作
#include <fcntl.h>
...

int fd = open("/proc/...", O_RDONLY);

double timestamp;

loff_t dummyOffset;

if ( read( fd, &timestamp, sizeof(timestamp) ) != sizeof(timestamp) ) {
  // Failure.
} else {
  // Use value in timestamp...
}

...