C Linux中被忽略信号的复位掩码
在C Linux中被忽略信号的复位掩码,c,linux,signals,posix,C,Linux,Signals,Posix,在exec()期间,阻塞信号的掩码(由sigprocmask()设置)由子进程继承 但现在我注意到,在Linux下,还有被忽略信号的掩码(grep
exec()
期间,阻塞信号的掩码(由sigprocmask()
设置)由子进程继承
但现在我注意到,在Linux下,还有被忽略信号的掩码(grep
),它也被子进程继承。由于这些是通过sigaction()
和act.sa_handler=SIG_IGN
设置的,因此我希望作为信号处理程序,它们在执行期间会重置。但事实并非如此
考虑下面的例子:父级希望忽略SIGINT,但这也扩展到了子级,因此不能再使用kill-INT$(pidof sleep)
杀死sleep 120
问题:
sigaction
的效果不会持续exec
(引用:“…直到调用其中一个exec函数”)。Linux手册页说“忽略信号的处理保持不变”,我想这是Linux特有的特性sigprocmask()
-管理阻塞信号-管理被忽略信号的掩码。我是否应该简单地迭代所有信号并使用sigaction()
重置它们#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
struct sigaction act;
sigset_t ss;
system("grep -n < /proc/self/status ^SigIgn");
memset(&act, 0, sizeof(act));
act.sa_handler = SIG_IGN;
sigaction( SIGINT, &act, NULL );
system("grep -n < /proc/self/status ^SigIgn");
sigemptyset(&ss);
sigprocmask(SIG_SETMASK, &ss, NULL);
system("grep -n < /proc/self/status ^SigIgn");
system("sleep 120");
return 0;
}
#包括
#包括
#包括
#包括
#包括
int main()
{
结构动作法;
sigset_t ss;
系统(“grep-n
exec*
调用继承的,尽管POSIX实际上没有后两个掩码的概念(它们只是特殊的信号处理,分别为每个信号设置,不同于可以整体修改的阻塞信号屏蔽)
sigaction
或sigaction
迭代信号(而sigaction
应优先考虑,对于将信号设置为SIG\u-IGN
/SIG\u-DFL
,信号充足、可移植且更紧凑)。理想情况下,这应在fork()之后进行
防止与其他线程争用(信号处理为共享全局状态)
更好的是,您可以使用带有属性(
posix\u spawnatr\t
)的posix\u spawn
/posix\u spawnp
)指定应在子进程中重置为默认值的信号集。posix\u spawnatr\u setsigdefault
属性设置器可用于指定此信号集。您不能将sigprocmask
与sigpemptyset
一起使用来重置拨叉的阻塞信号吗?这可能会帮助您: