父子进程对监听socket的处理可以分为以下两种
accept在fork后
代码结构如下
int main(int argc, char *argv[]){
socket();
bind();
listen();
fork();
if( parent ){
accept();
}
else if( child ){
accept();
}
else{
/*error*/
}
return 0;
}
子进程和父进程都会监听该socket(指向同一个打开的文件列表项),有新连接进入时,会唤醒一个进程进行accept,不会有惊群效应初显。并且,新的连接在父子进程是隔离的。
原文链接:https://my.oschina.net/u/2310891/blog/613850
accept在fork前(常用)
int main(int argc, char *argv[]){
socket();
bind();
listen();
while(1)
{
accept();
fork();
if( parent ){
close(newfd);
continue;
}
else if( child ){
close(listenfd);
read();
}
else{
/*error*/
}
}
return 0;
}
这种情况下,父进程不关心新连接的处理,故close之,子进程不关心新连接的建立,故close监听的fd。子进程和父进程的fd指向打开的文件列表的同一项,但是存在引用计数,故资源不会被回收。