一, 返回值问题:
做个功能,需要在hostap 模块和dnsmasq 执行一个shell 命令,于是就需要用到system系统调用了。
我们执行命令的时候老是出现返回值是256。
1,执行命令的环境没有,即它的源代码没运行起来,这里表现是我们的WiFidog 没有跑起来,反回了一个error给它。
2,我们的
dnsmasq 进程的USER是nobody的,而我们要执行命令进程的USER是root的,这个通过执行ps 命令能看到,
所以,dnsmasq没有执行权限执行这个命令。修改它的配置文件/etc/dnsmasq.conf ,在里面加上user ,重启即可。
具体情况可以看/etc/init.d/目录下的启动脚本。
关于system返回值的问题,这里有一个链接,里面讲的经我亲自验证都是对的。
http://blog.csdn.net/kulung/article/details/6524190
二、system 函数导致调用进程崩溃
遇到类似这个博文的问题:http://my.oschina.net/renhc/blog/53580 还有另一个博文:http://my.oschina.net/renhc/blog/54582
是否忽略了SIGCHLD,比如类似signal(SIGCHLD, SIG_IGN);
这样的话system是可以执行成功的,但system的返回指是通过waitpid()返回的,
实际是waitpid()设置errno为ECHILD
The system() function returns the exit status of the shell as returned by
waitpid(2), or -1 if an error occurred when invoking fork(2) or
waitpid(2). A return value of 127 means the execution of the shell
failed.
|
把我修改的代码拿上来:
typedef void (*sighandler_t)(int);
int my_system(const char *cmd_line)
{
int ret = 0;
sighandler_t old_handler;
if(NULL==cmd_line)
{
printf("error !!! cmd line is NULL\n");
return -1;
}
old_handler = signal(SIGCHLD, SIG_DFL);
ret = system(cmd_line);
signal(SIGCHLD, old_handler);
printf("the system return %d %s ret=%d old_handler=%d\n",errno,strerror(errno),ret,old_handler);
return ret;
}
最后我们看看百度百科里的这个 :
SIGCHLD
其中说道:
在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程。按系统默认将忽略此信号。如果希望被告知其子系统的这种状态,则应捕捉此信号。信号的捕捉函数中通常调用wait函数以取得进程ID和其终止状态。
阅读(2442) | 评论(0) | 转发(0) |