system调用与SIGCHLD信号
很多时候,我们需要通过system这个函数在程序内部来执行系统命令。
比如:
int rv = system("mount /mnt/hgfs");
最近有同事发现system调用返回-1,但事实上外部命令已成功执行。
经调查发现,原来是server在启动后将自己设置为daemon时,屏蔽了SIGCHLD信号导致的。在某些linux内核版本下,屏蔽SIGCHLD信号会导致system调用返回-1(经查,linux2.6内核以上无此问题)。system调用执行的流程应该是: fork->execve->waitpid,在某些内核实现中,可能没有恢复SIGCHLD信号,由此导致waitpid失败。
在system调用之前,应该手工恢复SIGCHLD信号:
signal(SIGCHLD, SIG_DFL);
int rv = system("mount /mnt/hgfs");
int rv = system("mount /mnt/hgfs");