套接字描述符是否被函数exit(退出代码)关闭?

时间:2012-03-09 11:43:20

标签: c sockets exit

我用c-unix语言创建了一个多进程客户端服务器。 与客户端的每个连接都作为子进程进行管理。 当发生错误时,我只需调用函数exit(EXIT_FAILURE),因为我读到该函数关闭所有打开的流。 问题是:我是否必须关闭客户端套接字描述符或自动关闭?

我的代码示例是:

while(1){
    if((client_sock=accept(ds_sock,&client,&s_client))==-1){
        printf("Accept error\n");
        exit(EXIT_FAILURE);
    }
    if(fork()==0){  //child
        if((close(ds_sock)==-1)){
            printf("Closing error\n");
            exit(EXIT_FAILURE);
        }
        if((read(client_sock,&up,sizeof(userpass)))==-1){
            printf("Error read\n");
            exit(EXIT_FAILURE); //Does this instruction close the client_sock too?
        }

1 个答案:

答案 0 :(得分:3)

您必须关闭父进程中的套接字,因为描述符在fork之后重复。

调用exit()将自动关闭子进程中的套接字,如您所怀疑的那样。

操作系统在完成后必须释放进程的所有资源,否则系统资源会被写得不好的程序耗尽。