我正在考虑为Raspberry Pi编写一个Linux内核模块。一切都很好,除了当我尝试使用copy_to_user或put_user时,如果我将其打印为llu,它总是返回值“34336”,如果我将其打印为字符,则它什么都没有。
有趣的是,它正在运行,我做了一些更改,它停止了工作,我恢复了工作版本,它不再有效。
模块代码:
ssize_t st_read(struct file *filp, char *buf, size_t count, loff_t *f_pos)
{
char memory_buffer = 'b';
/* Transferring data to user space */
copy_to_user(buf,memory_buffer,1);
/* Changing reading position as best suits */
if (*f_pos == 0) {
*f_pos+=1;
return 1;
} else {
return 0;
}
}
代码阅读价值:
fd = open("/dev/systimer", O_RDONLY);
// check for errors
if(fd < 0) {
perror("open(O_RDONLY)");
return errno;
} else
close(fd);
read(fd, &buf, 1);
printf("Buffer: %llu\n", buf);
printf("Buffer2: %c\n", buf);
输出是:
Buffer: 34336
Buffer2:
感谢。
答案 0 :(得分:0)
您在阅读前已关闭。您应该始终检查read()
// check for errors
if(fd < 0) {
perror("open(O_RDONLY)");
return errno;
} else
close(fd); // <-- you are closing the fd here
read(fd, &buf, 1); // <-- fd is closed
答案 1 :(得分:-1)
你试过吗?
copy_to_user(buf, &memory_buffer, 1);
答案 2 :(得分:-2)
您可以尝试使用以下代码而不是copy_to_user
sprintf(buf, "%u\n", memory_buffer);
-Phani