我从未使用过 POLL 信号,但它被列为具有默认操作来异常终止进程的信号:
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
它被标记为“已过时”,因此严格符合 POSIX 应用程序不得使用它。
我发现如果我尝试在 bash (5.0.17) 或 dash (0.5.10) 中捕获这样的信号,我会收到错误:
陷阱: POLL:坏陷阱
这是否会使 shell 不符合 POSIX 标准?
PS在同一系统中通过lksh(Ubuntu Linux 20.04中的mksh软件包版本58-1)测试:
#!/bin/lksh
sub() {
trap 'echo sub SIGPOLL; trap - POLL; exit' POLL
sleep 3 &
wait $!
return 0
}
sub &
pid=$!
sleep 1
kill -s POLL -- $pid
wait $pid
echo $?
trap 'echo SIGPOLL; trap - POLL; kill -s POLL -- $$' POLL
kill -s POLL -- $$
echo not here
输出
sub SIGPOLL
157
SIGPOLL
I/O possible
答案1
不,两个 shell 在这方面都是一致的。
重击是否支持SIGPOLL 在拥有它的系统上,就像破折号一样:
#if defined (SIGPOLL) /* Pollable event (for streams) */ signal_names[SIGPOLL] = "SIGPOLL"; #endif
如果您的系统没有它,系统本身可能不符合要求,但没有什么可以捕获的。
有一个论据可以证明这一点trap
是必须的支持所有名为的信号在表中,因此即使在本身不符合规范的系统上(尽管一致性是在系统级别定义的),尝试捕获 SIGPOLL 也应该是空操作而不是错误。
然而,SIGPOLL 是还列为其中的一部分XSI 流功能(XSR),它是可选的,因此使用其中功能的脚本只能移植到支持 XSI Streams 的另一个系统。这样的系统还包括 POLL 信号,因此炮弹也会接收到该信号。
这是一致的行为。