使用system函数时出现No child processes错误

问题:

调用system("cp file1 file2");出现No child processes错误,但是cp命令执行成功了。

在开发环境运行程序没有问题,但是当提交到测试环境后,出现的。


解决办法:

在网上搜索了一下,有解决这个问题的办法,就是在调用system之前将SIGCHLD信号设置成SIG_DFL,然后调用system之后,再将SIGCHLD设置成原来的处理方法。分析说可能是之前将SIGCHLD设置成了SIG_IGN(忽略)。虽然我是按照这个说法解决了,但是我其实自己查看过man手册上的说明,让我有了一些疑惑,通过查了一下《UNIX高级编程》之后算是彻底解决了。

查看man手册,system里面确实调用了waitpid,而system执行命令的时候,应该是使用了fork之后exec,现在报错是没有子进程,但是命令却执行成功了。那么就是父进程没有捕捉到子进程结束的状态。应该就是SIGCHLD这个信号没有被捕捉。

查看man 7 signal时,我看到上面说SIGCHLD默认就是ign(忽略),当时我就有点晕了,原本是说因为设置成了SIG_IGN(忽略)的问题,要设置成SIG_DFL才行,但是SIGCHLD设置成SIG_DFL后默认是ign(忽略)。

这里出现了两个忽略,让我直接晕了。后来还是弄明白了,看下面:

使用system函数时出现No child processes错误_第1张图片


指定成SIG_IGN,这里是指在内核处理时就忽略掉了这个信号,所以当子进程结束后,父进程接收不到SIGCHLD信号了。

但是指定成SIG_DFL后,系统默认动作是忽略。这个意思就是说,子进程结束后,产生了SIGCHLD信号,并且被父进程接收了,但是父进程接收到SIGCHLD信号的默认行为是忽略这个信号。


这里延伸一下:

使用system函数时出现No child processes错误_第2张图片

这里说了,如果在linux系统下,设置SIGCHLD为SIG_IGN,则不产生僵尸进程。

你可能感兴趣的:(child,调用system时No,processes错误)