调用system函数执行一个shell命令,返回-1,错误提示no child processes 但system可以执行成功
原因是调用system之前有放置忽略SIGCHLD的语句
signal(SIGCHLD, SIG_IGN);
如果SIGCHLD信号行为被设置为SIG_IGN时,waitpid()函数有可能因为找不到子进程而报ECHILD错误。似乎我们找到了问题的解决方案:在调用system()函数前重新设置SIGCHLD信号为缺省值,即signal(SIGCHLD, SIG_DFL)。
解决办法 用pox_system()函数替代system(),只需要修改此处一个函数,其他调用处都不需要改。
- typedef void (*sighandler_t)(int);
- int pox_system(const char *cmd_line)
- {
- int ret = 0;
- sighandler_t old_handler;
- old_handler = signal(SIGCHLD, SIG_DFL);
- ret = system(cmd_line);
- signal(SIGCHLD, old_handler);
- return ret;
- }
- typedef void (*sighandler_t)(int);
- int pox_system(const char *cmd_line)
- {
- int ret = 0;
- sighandler_t old_handler;
- old_handler = signal(SIGCHLD, SIG_DFL);
- ret = system(cmd_line);
- signal(SIGCHLD, old_handler);
- return ret;
- }
SIG_DFL:默认信号处理程序
SIG_IGN:忽略信号的处理程序
测试过确实很奏效,感谢帖子的作者!
参考文章:http://my.oschina.net/renhc/blog/54582