Chinaunix首页 | 论坛 | 博客
  • 博客访问: 150767
  • 博文数量: 49
  • 博客积分: 45
  • 博客等级: 民兵
  • 技术积分: 545
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-23 13:22
文章分类
文章存档

2017年(5)

2016年(18)

2015年(18)

2014年(8)

我的朋友

分类: 网络与安全

2015-09-15 15:11:53

一, 返回值问题:

做个功能,需要在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和其终止状态。

阅读(2389) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~