SIGIO到达文件描述符时,我没有设置它,并且当没有可能的IO时

SIGIO到达文件描述符时,我没有设置它,并且当没有可能的IO时,第1张

SIGIO到达文件描述符时,我没有设置它,并且当没有可能的IO时

啊,有趣。

简短的答案是,因为stdin是 可写的 ,所以SIGIO反复到达stdin ,并且单独地,您的SIGIO传递设置不正确。

为什么si_fd显然不可靠?

首先,您需要先指定SA_SIGINFO

sa_flags
才能安全使用
sa_sigaction
处理程序。

其次,

#define _GNU_SOURCE
在Linux
为您填充
si_fd
(和
si_band
)之前,您需要将F_SETSIG显式地添加到SIGIO
。有点傻,恕我直言,但事实如此。
si_fd
如您所发现的,没有这个,传入的值就没有意义。

为什么要反复交付SIGIO?

我猜您程序的stdin是从您调用的shell继承的,我猜它是一个终端设备并且是可写的。就像fd 0会持续 select(2)
可写一样,它也会连续为您生成SIGIO。

无论如何,

si_band
保持答案。启用F_SETSIG,,
#include<poll.h>
并检查
si_band
POLLIN,POLLOUT等,以确定哪些I / O事件使信号跳闸

真的,stdin是可写的吗?

是的 尝试以下比较:

$ [ -w /dev/stdin ] && echo Yes, stdin is writeableYes, stdin is writeable# Endless SIGIOs$ ./my-sigio-prog^C# No SIGIO$ ./my-sigio-prog < /dev/null# Two SIGIOs, after a delay.  One for line-buffered "foon" and one for EOF$ { sleep 3; echo foo; sleep 3; } | ./my-sigio-prog


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5015241.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存