免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3200 | 回复: 7
打印 上一主题 下一主题

socket中的system调用问题(大家帮忙看看) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-22 16:24 |只看该作者 |倒序浏览
15可用积分
在socket主程序中,当有连接过来时,fork出一个子进程做数据处理工作,并且在主程序中利用signal(SIGCHLD,(sighandler_t)sig_waitchild)来等待子进程接收并回收子进程资源。但是在子进程中,又调用了system函数。结果,在程序的运行过程中,在另一个终端上用netstat -antl命令查看,发现有很多进程并没有结束,状态是CLOSE_WAIT,如下所示:
tcp        1      0 192.168.1.238:51113         192.168.1.228:4809          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:4808          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:4802          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:1749          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:1750          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:4817          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:4816          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:4819          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:4818          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:1769          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:1761          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:1762          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:1533          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:4863          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:1535          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:4862          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:1677          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:1673          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:1160          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:1675          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:1163          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:1671          CLOSE_WAIT
tcp        1      0 192.168.1.238:51113         192.168.1.228:1159          CLOSE_WAIT
这些进程是system函数产生的进程?该怎么结束他们???

论坛徽章:
0
2 [报告]
发表于 2010-01-22 17:22 |只看该作者
  1. #include <sys/socket.h>
  2. #include <arpa/inet.h>
  3. #include <netinet/in.h>
  4. #include <sys/types.h>
  5. #include <sys/ipc.h>
  6. .........
  7. .........
  8. .........
  9. #include <sys/wait.h>

  10. void sig_waitchild(void)
  11. {
  12.         pid_t pid;
  13.         /*signal(SIGCHLD,(sighandler_t)sig_waitchild);
  14.         while ((pid = waitpid(-1, NULL, WNOHANG)) > 0) {
  15.                 ;
  16.         }*/
  17.         pid = waitpid(-1,NULL,WNOHANG);
  18.         printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ %d\n",pid);

  19. }
  20. int init_service(struct sockaddr_in* servaddr)
  21. {
  22.         int lisfd;
  23.         int opt = 1;
  24.         int len = sizeof(opt);
  25.         lisfd = socket(PF_INET,SOCK_STREAM,0);
  26.         setsockopt(lisfd,SOL_SOCKET,SO_REUSEADDR,(void*)&opt,len);
  27.         if(lisfd < 0)
  28.                 return (-1);
  29.         if(bind(lisfd,(struct sockaddr *) servaddr,sizeof(struct sockaddr_in)) < 0)
  30.                 return (-1);
  31.         if(listen(lisfd,20) < 0)
  32.                 return (-1);
  33.         return (lisfd);
  34. }

  35. int main(int argc, char **argv)
  36. {
  37.         int lisfd, confd, maxfd,close_flag;
  38.         int nready;
  39.     int errno;
  40.         ............
  41.         ............
  42.         pid_t childpid;
  43.         socklen_t clientlen;
  44.         fd_set rset;
  45.         int recv_len = 0,send_len = 0;
  46.         if (alreadyrun() == 1) {        /*保证daemon是单实例运行*/
  47.                 printf("a daemon already running\n");
  48.                 exit(0);
  49.         }
  50.         bzero(&servaddr,sizeof(servaddr));
  51.         bzero(&cliaddr,sizeof(cliaddr));
  52.         servaddr.sin_port = htons(BIND_PORT);
  53.         servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  54.         servaddr.sin_family = AF_INET;
  55.         if ((lisfd = init_service(&servaddr)) < 0) {
  56.                 perror("init_service");       
  57.                 exit(-1);
  58.         }
  59.         signal(SIGCHLD,(sighandler_t)sig_waitchild);
  60.         maxfd = lisfd;
  61.     FD_ZERO(&rset);
  62.         FD_SET(lisfd,&rset);
  63.         for (;;) {
  64.             nready = select(maxfd+1,&rset,NULL,NULL,NULL);       
  65.                 if(nready < 0) {
  66.                         if(errno == EINTR)
  67.                                 continue;
  68.                         //perror("select");       
  69.                 }
  70.                 if(FD_ISSET(lisfd,&rset))
  71.                 {
  72.                         clientlen = sizeof(cliaddr);
  73.                         confd = accept(lisfd, (struct sockaddr *)&cliaddr, &clientlen);
  74.                         if(confd < 0)
  75.                         {
  76.                                 //perror("accept");
  77.                                 exit(1);
  78.                         }
  79.                         if ((childpid = fork()) < 0) {
  80.                                 perror("fork");
  81.                         }
  82.                         else if (childpid == 0)
  83.                         {
  84.                                 close(lisfd);
  85.                                 数据接收、处理、发送工作;
  86.                                 .................
  87.                                 .................
  88.                                 close(confd);
  89.                         }
  90.                 }/*end of if(FD_ISSET(lisfd,&rset)) */
  91.     } /* end of for() */
  92.         return 0;
  93. }


复制代码

[ 本帖最后由 kewenliang 于 2010-1-22 17:24 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2010-01-22 18:36 |只看该作者
应该在父进程里面也 close(confd); 一下吧~

论坛徽章:
0
4 [报告]
发表于 2010-01-26 14:39 |只看该作者

回复 #1 kewenliang 的帖子

本帖最后由 rlingxing 于 2010-02-09 13:44 编辑

你说过,你在子进程中调用了system函数产生的进程,那应要在里就结束啊。
就像调用execl一样。要自己去处理!

你这种情况是系统覆盖了之后,又没有回收,才这样的。

[ 本帖最后由 rlingxing 于 2010-1-26 14:44 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2010-01-26 16:57 |只看该作者
出现这种情况不是由system系统调用造成的。在网上找了不少帖子,可以通过修改/etc/sysctl.conf配置文件解决此类问题。

论坛徽章:
0
6 [报告]
发表于 2010-01-27 15:41 |只看该作者
可不可以通过程序来解决,请大家讨论一下,谢谢了。

论坛徽章:
0
7 [报告]
发表于 2010-02-08 10:41 |只看该作者
父进程里面的信号处理函数void sig_waitchild(void)在子进程里面也有效吧?因为子进程复制了父进程的资源,所以该信号处理函数的函数地址等也在子进程里有效。

论坛徽章:
0
8 [报告]
发表于 2010-02-10 12:05 |只看该作者
System中调用个脚本,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP