Chinaunix
标题:
socket中的system调用问题(大家帮忙看看)
[打印本页]
作者:
kewenliang
时间:
2010-01-22 16:24
标题:
socket中的system调用问题(大家帮忙看看)
在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函数产生的进程?该怎么结束他们???
作者:
kewenliang
时间:
2010-01-22 17:22
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/ipc.h>
.........
.........
.........
#include <sys/wait.h>
void sig_waitchild(void)
{
pid_t pid;
/*signal(SIGCHLD,(sighandler_t)sig_waitchild);
while ((pid = waitpid(-1, NULL, WNOHANG)) > 0) {
;
}*/
pid = waitpid(-1,NULL,WNOHANG);
printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ %d\n",pid);
}
int init_service(struct sockaddr_in* servaddr)
{
int lisfd;
int opt = 1;
int len = sizeof(opt);
lisfd = socket(PF_INET,SOCK_STREAM,0);
setsockopt(lisfd,SOL_SOCKET,SO_REUSEADDR,(void*)&opt,len);
if(lisfd < 0)
return (-1);
if(bind(lisfd,(struct sockaddr *) servaddr,sizeof(struct sockaddr_in)) < 0)
return (-1);
if(listen(lisfd,20) < 0)
return (-1);
return (lisfd);
}
int main(int argc, char **argv)
{
int lisfd, confd, maxfd,close_flag;
int nready;
int errno;
............
............
pid_t childpid;
socklen_t clientlen;
fd_set rset;
int recv_len = 0,send_len = 0;
if (alreadyrun() == 1) { /*保证daemon是单实例运行*/
printf("a daemon already running\n");
exit(0);
}
bzero(&servaddr,sizeof(servaddr));
bzero(&cliaddr,sizeof(cliaddr));
servaddr.sin_port = htons(BIND_PORT);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_family = AF_INET;
if ((lisfd = init_service(&servaddr)) < 0) {
perror("init_service");
exit(-1);
}
signal(SIGCHLD,(sighandler_t)sig_waitchild);
maxfd = lisfd;
FD_ZERO(&rset);
FD_SET(lisfd,&rset);
for (;;) {
nready = select(maxfd+1,&rset,NULL,NULL,NULL);
if(nready < 0) {
if(errno == EINTR)
continue;
//perror("select");
}
if(FD_ISSET(lisfd,&rset))
{
clientlen = sizeof(cliaddr);
confd = accept(lisfd, (struct sockaddr *)&cliaddr, &clientlen);
if(confd < 0)
{
//perror("accept");
exit(1);
}
if ((childpid = fork()) < 0) {
perror("fork");
}
else if (childpid == 0)
{
close(lisfd);
数据接收、处理、发送工作;
.................
.................
close(confd);
}
}/*end of if(FD_ISSET(lisfd,&rset)) */
} /* end of for() */
return 0;
}
复制代码
[
本帖最后由 kewenliang 于 2010-1-22 17:24 编辑
]
作者:
kouu
时间:
2010-01-22 18:36
应该在父进程里面也 close(confd); 一下吧~
作者:
rlingxing
时间:
2010-01-26 14:39
标题:
回复 #1 kewenliang 的帖子
本帖最后由 rlingxing 于 2010-02-09 13:44 编辑
你说过,你在子进程中调用了system函数产生的进程,那应要在里就结束啊。
就像调用execl一样。要自己去处理!
你这种情况是系统覆盖了之后,又没有回收,才这样的。
[
本帖最后由 rlingxing 于 2010-1-26 14:44 编辑
]
作者:
kewenliang
时间:
2010-01-26 16:57
出现这种情况不是由system系统调用造成的。在网上找了不少帖子,可以通过修改/etc/sysctl.conf配置文件解决此类问题。
作者:
kewenliang
时间:
2010-01-27 15:41
可不可以通过程序来解决,请大家讨论一下,谢谢了。
作者:
kewenliang
时间:
2010-02-08 10:41
父进程里面的信号处理函数void sig_waitchild(void)在子进程里面也有效吧?因为子进程复制了父进程的资源,所以该信号处理函数的函数地址等也在子进程里有效。
作者:
iorifreedom
时间:
2010-02-10 12:05
System中调用个脚本,呵呵
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2