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

5
我在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?
        }

正确地关闭套接字的主题充满了许多陷阱。只举一个随机的例子:https://dev59.com/LGcs5IYBdhLWcg3wlFA2 - Ron Burk
1个回答

4

在 fork() 之后,由于描述符被复制,因此您必须在父进程中关闭套接字。

正如您已经猜到的那样,调用 exit() 将自动关闭子进程中的套接字。

当进程结束时,操作系统必须释放其所有资源,否则系统资源会被糟糕编写的程序耗尽。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接