当前位置: 技术问答>linux和unix
socket 编程问题??
来源: 互联网 发布时间:2016-08-16
本文导语: 我写的通信程序,为什么在本机上运行几分钟后,cpu占用率奇高?? | while(1) { bzero(receive,MAX_CMD); if( read(peer_sockmsg,receive,MAX_CMD) == -1 ) { perror("read errorn"); exit(1); } if( !strcmp(receive,"quit")) { cmd_quit(peer_s...
我写的通信程序,为什么在本机上运行几分钟后,cpu占用率奇高??
|
while(1)
{
bzero(receive,MAX_CMD);
if( read(peer_sockmsg,receive,MAX_CMD) == -1 )
{
perror("read errorn");
exit(1);
}
if( !strcmp(receive,"quit"))
{
cmd_quit(peer_sock,peer_sockmsg);
continue;
}
else if( !strcmp(receive,"cd") )
{
cmd_cd(peer_sock,peer_sockmsg);
continue;
}
else if( !strcmp(receive,"dir") )
{
cmd_dir(peer_sock,peer_sockmsg);
continue;
}
else if( !strcmp(receive,"qwd") )
{
cmd_qwd(peer_sock,peer_sockmsg);
continue;
}
else if( !strcmp(receive,"get") )
{
cmd_get(peer_sock,peer_sockmsg);
printf("here!n");//debug
continue;
}
/* incomplited*/
}
}
}
while(1);
}
红色部分,是怎么回事呢?
|
你do {} while(1) 循环fork一次建立一个子进程
你说父进程用于accept,这个没错
可你干嘛在子进程里面又while(1)啊?
每个子进程不停的read?
就是说你开无数个进程,每个进程都无限循环read
最终造成资源被耗尽 ....
你这种设计就不对!
如果你非要坚持用死循环,也只能在父进程用,子进程用完就exit退出
再具体就没得说了 ....
|
等等,等等,等等,你这个服务器不是短连接吗?
客户端connect完就close,不是吗?(我一直是按这个思路走的)
如果是这样,你子进程的read阻塞读取就没有意义
反过来说,如果是长连接,出现资源耗费的情况,那问题就在客户端了
|
如果你确认为长连接的话,那最好检查一下你客户端的代码是否有问题吧
如果你客户端代码存在close关闭连接的情况
就会出现服务端大量子进程造成资源浪费导致资源最终被耗尽
如果你客户端代码存在close关闭连接的情况
就会出现服务端大量子进程造成资源浪费导致资源最终被耗尽