写入Linux设备驱动程序会导致无限循环
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了写入Linux设备驱动程序会导致无限循环,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1573字,纯文字阅读大概需要3分钟。
内容图文
![写入Linux设备驱动程序会导致无限循环](/upload/InfoBanner/zyjiaocheng/967/342d84097ea74dfca57d068f3078594d.jpg)
我一直在编写一个可以从用户空间读取和写入的内核空间设备驱动程序.开放,阅读,发布操作都完美无缺.我遇到的问题是应该访问设备驱动程序并向其写入内容的用户空间代码.
用户空间程序写入两个文件:1)到.txt文件(并打印到控制台以让用户知道它已完成),以及2)到设备驱动程序(并且还打印文本以让用户知道它也已完成).
以下是完整的用户空间代码:
int main() {
FILE *fp;
fp = fopen("./test.txt","w");
fputs("Test\n", fp);
fclose(fp);
printf("Printed to txt\n"); //Prints normally.
fp = fopen("/dev/testchar", "w");
fputs("Test\n", fp);
fclose(fp);
printf("Printed to dev\n"); //Never gets to this point
return 0;
}
当我编译并运行代码程序吐出时
打印到txt
然后挂起,直到调用ctrl c.它永远不会超越第二个fputs().
在监视kern.log时,我看到无限次调用写入设备驱动程序.
这里我从设备驱动程序中提取了相关代码:
static char msg[256] = {0};
static struct file_operations fops =
{
.write = dev_write
};
static ssize_t dev_write(struct file *file, const char *buf, size_t len, loff_t *ppos)
{
sprintf(msg, "Input:%s, Chars:%lu\n", buf, len);
printk(KERN_NOTICE "%s\n", msg);
return 0;
}
uname -r:4.10.0-38-generic
gcc -v:gcc版本5.4.0 20160609(Ubuntu 5.4.0-6ubuntu1~16.04.4)
我的问题是:为什么程序在写入设备时会陷入无限循环,我该如何解决?
提前致谢.任何帮助将不胜感激.
解决方法:
我认为内核写操作应该返回写入的字节数.您返回0.因此,写入系统调用返回到用户空间为0.但是,由于您的用户空间代码使用stdio,因此您的用户空间代码会再次尝试写入,假设系统调用只是没有写出所有数据.如果返回输入的长度,则stdio将知道所有数据都已写入.或者,您可以直接使用write系统调用而不是fput.您的内核代码仍然不正确,但您的程序将终止.
您可以使用strace测试它并查看所有系统调用.
内容总结
以上是互联网集市为您收集整理的写入Linux设备驱动程序会导致无限循环全部内容,希望文章能够帮你解决写入Linux设备驱动程序会导致无限循环所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。