QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3542|回复: 2

使用fork() +execv() 遇到问题 请各位帮忙 ??

[复制链接]
发表于 2008-1-6 11:47:20 | 显示全部楼层 |阅读模式
还是先看一下代码吧!!
  1. int my_exec(char **cmd,int flag)
  2. {
  3. int status = 0;
  4. int pid = 0;
  5. if((pid=fork())==0){
  6.   execv(cmd[0],cmd);
  7.   fprintf(stderr,"execv():%s .\n",strerror(errno));
  8.   exit(errno);
  9.   //child !
  10. }
  11. else if(pid == -1 ){ ///error .
  12.    fprintf(stderr,"fork():%s \n",strerror(errno));
  13.    return pid;
  14.   }
  15. if(flag == 0){//father
  16.     waitpid(pid,&status, WNOHANG);
  17.     return WEXITSTATUS(status);
  18.   }
  19.   else if (flag == 1 )
  20.      return pid;
  21.   return (!0);
  22. }
复制代码


  1. void handler()
  2. {
  3.   FILE *fd = NULL;
  4.   char *fpath ="/proc/net/dev";
  5.   ppp *p = NULL;
  6.   char *stt = NULL;
  7.   char *cmd[]={"/home/codes/script/pppoecount.sh",username,"8",NULL};
  8.   alarm(2);
  9.   fd= fopen (fpath, "r" );
  10.   if(!fd){
  11.     g_print("Can't fopen(): %s :%s\n",fpath,strerror(errno));
  12.     return;
  13.   }
  14.   //g_print("come to handler for alarm .\n");
  15.   p = get_ppps(fd);
  16.   stt = sprint_ppp(p);
  17.   if(g_strrstr(stt,"eth"))t_sec+=2;
  18.   else t_sec = 0;
  19.   sprintf(&stt[strlen(stt)],"ppp time: %ld:%ld:%ld.\n",t_sec/(3600),(t_sec/60)%60,t_sec%60);
  20.   if(label)gtk_label_set_text(GTK_LABEL(label),stt);
  21.   free_ppp(p);
  22. ////////////////////// 只能这样做标记了
  23.   if(t_sec%8==0my_exec(cmd,1);
  24. /////////////////////
  25.   if(fd)fclose(fd);
  26. }
复制代码

handler 在一个 程序 调用多次后:
$ps aux
root     19748  0.0  0.0      0     0 pts/2    Z    22:21   0:00 [pppoecount.sh] <defunct>
root     19755  0.0  0.0      0     0 pts/2    Z    22:21   0:00 [pppoecount.sh] <defunct>
root     19761  0.0  0.0      0     0 pts/2    Z    22:21   0:00 [pppoecount.sh] <defunct>
root     19767  0.0  0.0      0     0 pts/2    Z    22:21   0:00 [pppoecount.sh] <defunct>
root     19773  0.0  0.0      0     0 pts/2    Z    22:21   0:00 [pppoecount.sh] <defunct>
root     19779  0.0  0.0      0     0 pts/2    Z    22:22   0:00 [pppoecount.sh] <defunct>
root     19785  0.0  0.0      0     0 pts/2    Z    22:22   0:00 [pppoecount.sh] <defunct>
root     19791  0.0  0.0      0     0 pts/2    Z    22:22   0:00 [pppoecount.sh] <defunct>
root     19797  0.0  0.0      0     0 pts/2    Z    22:22   0:00 [pppoecount.sh] <defunct>
root     19803  0.0  0.0      0     0 pts/2    Z    22:22   0:00 [pppoecount.sh] <defunct>
root     19809  0.0  0.0      0     0 pts/2    Z    22:22   0:00 [pppoecount.sh] <defunct>
root     19815  0.0  0.0      0     0 pts/2    Z    22:22   0:00 [pppoecount.sh] <defunct>
root     19821  0.0  0.0      0     0 pts/2    Z    22:23   0:00 [pppoecount.sh] <defunct>
root     19827  0.0  0.0      0     0 pts/2    Z    22:23   0:00 [pppoecount.sh] <defunct>
root     19835  0.0  0.0      0     0 pts/2    Z    22:23   0:00 [pppoecount.sh] <defunct>
root     19841  0.0  0.0      0     0 pts/2    Z    22:23   0:00 [pppoecount.sh] <defunct>
root     19847  0.0  0.0      0     0 pts/2    Z    22:23   0:00 [pppoecount.sh] <defunct>
root     19853  0.0  0.0      0     0 pts/2    Z    22:23   0:00 [pppoecount.sh] <defunct>
root     19859  0.0  0.0      0     0 pts/2    Z    22:23   0:00 [pppoecount.sh] <defunct>
root     19865  0.0  0.0      0     0 pts/2    Z    22:23   0:00 [pppoecount.sh] <defunct>
root     19871  0.0  0.0      0     0 pts/2    Z    22:24   0:00 [pppoecount.sh] <defunct>
root     19877  0.0  0.0      0     0 pts/2    Z    22:24   0:00 [pppoecount.sh] <defunct>
root     19884  0.0  0.0      0     0 pts/2    Z    22:24   0:00 [pppoecount.sh] <defunct>
root     19890  0.0  0.0      0     0 pts/2    Z    22:24   0:00 [pppoecount.sh] <defunct>
root     19896  0.0  0.0      0     0 pts/2    Z    22:24   0:00 [pppoecount.sh] <defunct>
root     19902  0.0  0.0      0     0 pts/2    Z    22:24   0:00 [pppoecount.sh] <defunct>
root     19908  0.0  0.0      0     0 pts/2    Z    22:24   0:00 [pppoecount.sh] <defunct>
root     19914  0.0  0.0      0     0 pts/2    Z    22:25   0:00 [pppoecount.sh] <defunct>
root     19920  0.0  0.0      0     0 pts/2    Z    22:25   0:00 [pppoecount.sh] <defunct>
root     19926  0.0  0.0      0     0 pts/2    Z    22:25   0:00 [pppoecount.sh] <defunct>
root     19932  0.0  0.0      0     0 pts/2    Z    22:25   0:00 [pppoecount.sh] <defunct>
root     19938  0.0  0.0      0     0 pts/2    Z    22:25   0:00 [pppoecount.sh] <defunct>
root     19944  0.0  0.0      0     0 pts/2    Z    22:25   0:00 [pppoecount.sh] <defunct>
root     19950  0.0  0.0      0     0 pts/2    Z    22:25   0:00 [pppoecount.sh] <defunct>
root     19956  0.0  0.0      0     0 pts/2    Z    22:25   0:00 [pppoecount.sh] <defunct>
root     19962  0.0  0.0      0     0 pts/2    Z    22:26   0:00 [pppoecount.sh] <defunct>
root     19968  0.0  0.0      0     0 pts/2    Z    22:26   0:00 [pppoecount.sh] <defunct>
root     19974  0.0  0.0      0     0 pts/2    Z    22:26   0:00 [pppoecount.sh] <defunct>
root     19980  0.0  0.0      0     0 pts/2    Z    22:26   0:00 [pppoecount.sh] <defunct>
root     19986  0.0  0.0      0     0 pts/2    Z    22:26   0:00 [pppoecount.sh] <defunct>
root     19992  0.0  0.0      0     0 pts/2    Z    22:26   0:00 [pppoecount.sh] <defunct>
root     19998  0.0  0.0      0     0 pts/2    Z    22:26   0:00 [pppoecount.sh] <defunct>
linux    20005  1.3  5.3  40952 13676 pts/1    SL+  22:26   0:00 mplayer -ao alsa -vo null /media/hdb5/music/ha
root     20006  0.0  0.0      0     0 pts/2    Z    22:27   0:00 [pppoecount.sh] <defunct>
root     20012  0.0  0.0      0     0 pts/2    Z    22:27   0:00 [pppoecount.sh] <defunct>
root     20018  0.0  0.0      0     0 pts/2    Z    22:27   0:00 [pppoecount.sh] <defunct>
root     20024  0.0  0.0      0     0 pts/2    Z    22:27   0:00 [pppoecount.sh] <defunct>
linux    20030  0.0  0.3   5804  1028 pts/4    R+   22:27   0:00 ps aux
脚本都运行结束了啊!!
[pppoecount.sh] <defunct> 为什么还在啊??

当然如果程序关闭,[pppoecount.sh] <defunct> 就没有了!
这个东西有点烦人,恳请有人能帮我把它弄掉??

[ 本帖最后由 wkt 于 2008-1-6 11:50 编辑 ]
发表于 2008-1-6 18:43:14 | 显示全部楼层
oh,著名的僵尸进程。
  在程序中ignore掉SIGCHLD即可。

Regards
PowerGUI
---------------------------------
开放手机联盟 Android中文社区(Google手机操作系统)
http://www.openhandsetalliance.org.cn
回复

使用道具 举报

 楼主| 发表于 2008-1-6 23:32:33 | 显示全部楼层
原帖由 PoewerGUI 于 2008-1-6 18:43 发表
oh,著名的僵尸进程。
  在程序中ignore掉SIGCHLD即可。


很有效多谢了!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-4-24 19:49 , Processed in 0.074504 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表