0%

accpet和fork的顺序

父子进程对监听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指向打开的文件列表的同一项,但是存在引用计数,故资源不会被回收。