POSIX shell 应该支持 SIGPOLL 信号吗?

POSIX shell 应该支持 SIGPOLL 信号吗?

我从未使用过 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 信号,因此炮弹也会接收到该信号。

这是一致的行为。

相关内容