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");

 

 

posted @ 2010-04-06 11:13  web-backend  阅读(1082)  评论(0编辑  收藏  举报