Linux – 为什么自定义系统调用与负数无法正常工作?
发布时间:2020-12-13 19:05:49 所属栏目:Linux 来源:网络整理
导读:我写了一个自定义系统调用,比较两个整数并返回最大的整数.这是我的内核端代码: max.c #include 这是我的用户空间代码: max.h #include 我正在使用这个小程序来测试系统调用: #include 它对正数很有用,或者当一个是正数而另一个是负数时,但是当处理两个负
我写了一个自定义系统调用,比较两个整数并返回最大的整数.这是我的内核端代码: max.c
这是我的用户空间代码: max.h
我正在使用这个小程序来测试系统调用:
它对正数很有用,或者当一个是正数而另一个是负数时,但是当处理两个负值时,max总是返回-1.我想知道这是否是因为int->长转换,但我似乎无法理解导致问题的原因. 最佳答案
如果系统调用返回负值,则将其视为错误,并在libc中调用特殊错误处理代码.也就是说,返回值被否定并移入errno全局变量,系统调用的返回值变为-1.
实际上,在阅读这篇文章的时候,我发现在Linux上,only values from -4095 to -1 are treated as errors,但是如果你希望你的函数能够处理任何可能的值,那么它既不可移植也不会有用. 简而言之,您无法安全地使用系统调用的返回值来返回可能为负值的值.通常的惯例是传递指向目标变量的指针来保存结果,并保留成功/失败的返回码.请注意,使用系统调用执行此操作时,您将使用来自内核空间的用户空间指针,因此编写结果需要copy_to_user. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- linux 系统中的 /bin /sbin /usr/bin /usr/sbin /usr/local
- linux – iozone:5个并发线程随机读取300K块比仅使用一个线
- supervisord autorestart max尝试?
- Linux reboot()系统调用:为什么在kernel_halt()之后调用do
- linux CentOS7 安装 Java
- quota - linux磁盘配额管理
- linux – 如何编写一行命令,将目录中的所有子目录scp到远程
- Linux Shell常用技巧(八)
- linux – 在挂载失败时防止root系统填满的最佳方法?
- linux – 当参数列表太长时,如何正确使用“xargs”