Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么信号SIGABRT在子进程中被忽略_Linux_Unix - Fatal编程技术网

Linux 为什么信号SIGABRT在子进程中被忽略

Linux 为什么信号SIGABRT在子进程中被忽略,linux,unix,Linux,Unix,我们有一个Linux服务进程,它使用fork生成一个子进程,然后运行execelp来执行另一个程序。当我们运行命令“kill-6[child_pid]”时,它没有任何效果。如果子程序自己运行,同样的命令将杀死它,因此我们非常确定在这种情况下系统正在处理信号。那么,当它在te服务进程的控制下时,为什么子进程不接收它呢?任何帮助都将不胜感激 这在RedHat Linux和CentOS中发生 核心文件大小设置为无限 我还想提到,相同的命令在父进程上工作,因此我们知道父进程不处理(忽略)SIGABRT。

我们有一个Linux服务进程,它使用fork生成一个子进程,然后运行execelp来执行另一个程序。当我们运行命令“kill-6[child_pid]”时,它没有任何效果。如果子程序自己运行,同样的命令将杀死它,因此我们非常确定在这种情况下系统正在处理信号。那么,当它在te服务进程的控制下时,为什么子进程不接收它呢?任何帮助都将不胜感激

这在RedHat Linux和CentOS中发生

核心文件大小设置为无限

我还想提到,相同的命令在父进程上工作,因此我们知道父进程不处理(忽略)SIGABRT。父级由shell脚本(bash)运行。所以在运行命令“ps”时,我看到了shell脚本pid、父pid和子pid。该命令适用于父pid和shell脚本pid


我的理解是,即使子进程继承了信号处理程序,在execlp之后,子程序也不会继承

子进程在执行
分叉时从父进程继承其信号掩码


因此,我推测您的父进程正在阻止SIGABRT(via)。

引用
man sigaAction

通过fork(2)创建的子级继承其父级信号dis的副本 位置。在execve(2)期间,处理过的信号的处理 重置为默认值;忽略信号的处理被保留 不变


因此,我猜想服务进程被设置为忽略SIGABRT,这是由子进程继承的。

正如我编辑的问题所提到的,父进程实际上不会忽略或阻止SIGABRT,因此继承在这里不重要。但问题是为什么儿童节目没有收到信号?你的理解是不正确的。。。函数的类型将导致子级同时继承忽略和阻止的信号。这里没有魔法;要么内核有缺陷(可能性很小),要么子进程正在阻塞或忽略
SIGABRT
。没有其他可能性。