当前位置: 技术问答>linux和unix
socket中的system调用问题
来源: 互联网 发布时间:2016-08-02
本文导语: 在socket主程序中,当有连接过来时,fork出一个子进程做数据处理工作,并且在主程序中利用signal(SIGCHLD,(sighandler_t)sig_waitchild)来等待子进程接收并回收子进程资源。但是在子进程中,又调用了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函数产生的进程?该怎么结束他们???
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函数产生的进程?该怎么结束他们???
|
lz漏了非常重要的一点
每创建一个子进程
父进程必须也要 close(confd);
才行
否则只有程序结束, confd才会被真正关闭
每创建一个子进程
父进程必须也要 close(confd);
才行
否则只有程序结束, confd才会被真正关闭
|
另外子进程结束后,在 close(confd);
后直接跟 exit
不然子进程也会继续执行后面的
后直接跟 exit
不然子进程也会继续执行后面的
|
"在子进程中,又调用了system函数。"
把子进程的
close(confd);
放在system函数前面。
把子进程的
close(confd);
放在system函数前面。
|
帮顶
|
CLose_Wait是表示关闭时的4次握手没有完成啊。
|
for (;;) {
FD_ZERO(&rset); //必须对每个连接都重新设置
FD_SET(lisfd,&rset);
nready = select(maxfd+1,&rset,NULL,NULL,NULL);
if(nready
FD_ZERO(&rset); //必须对每个连接都重新设置
FD_SET(lisfd,&rset);
nready = select(maxfd+1,&rset,NULL,NULL,NULL);
if(nready