啊,有趣。
简短的答案是,因为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_bandPOLLIN,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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)