有什么专家能帮我做下面的事吗?
我在C中有以下系统调用:
access()
unlink()
setsockopt()
fcntl()
setsid()
socket()
bind()
listen()我想知道他们是否可能在错误代码-1和errno EINTR/EAGAIN中失败。
为了这些我应该处理EINTR/EAGAIN吗?
这些文档没有提到任何与EINTR/EAGAIN相关的内容,但是我看到很多人都在处理它。
哪个是正确的?
下面是我如何注册信号处理程序:https://gitorious.org/zepto-web-server/zepto-web-server/source/b1b03b9ecccfe9646e34caf3eb04689e2bbc54dd:src/signal-dispatcher-utility.c
这里还有一个提交,我在一些我知道返回EINTR或EAGAIN:https://gitorious.org/zepto-web-server/zepto-web-server/commit/b1b03b9ecccfe9646e34caf3eb04689e2bbc54dd的系统调用中添加了一些EINTR/EAGAIN处理
发布于 2014-09-08 17:38:51
参见http://man7.org/linux/man-pages/man7/signal.7.html --开始阅读底部的内容,其中提到“中断系统调用和库函数.”这是一个Linux手册页,但是这个信息通常适用于任何Unix/Posix/Linux风格的系统。
发布于 2014-09-08 17:41:22
除非您安装了一个中断信号处理程序(一个安装在sigaction上,省略了SA_RESTART标志,或者一个在某些系统上安装了signal函数),否则您不应该期望在所有中都会看到EINTR 。
在您特定的函数列表中,除了fcntl之外,我没有看到任何可以体验到fcntl的函数,而且只有当它用于锁定时才能使用。但是,John的答案中的链接应该有助于回答有关特定功能的问题。
发布于 2014-09-08 18:13:55
在*NIX系统调用的每个手册页中都有一个题为错误的部分。参考手册,例如:http://man7.org/linux/man-pages/man2/accept.2.html。您还可以使用命令行man accept查看它。
通常,需要一些时间计算的系统调用可以在信号传递时设置-1+EINTR,而短系统调用则不设置。例如,accept()可以阻止您的进程,这样它就可以被信号中断,但是setsid()太短了,以至于它已经被写成不能被信号中断。
https://stackoverflow.com/questions/25729901
复制相似问题