我用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?
}
答案 0 :(得分:3)
您必须关闭父进程中的套接字,因为描述符在fork之后重复。
调用exit()将自动关闭子进程中的套接字,如您所怀疑的那样。
操作系统在完成后必须释放进程的所有资源,否则系统资源会被写得不好的程序耗尽。