关于shutdown和close
示例代码:
1 void str_cli(FILE *fp, int sockfd) 2 { 3 pid_t pid; 4 char sendline[MAXLINE], recvline[MAXLINE]; 5 if ((pid = fork()) == 0) { //A 6 while (readline(sockfd, recvline, MAXLINE) > 0) 7 fputs(recvline, stdout); 8 kill(getpid(), SIGTERM); 9 exit(0); 10 } 11 while(fgets(sendline, MAXLINE, fp) != NULL) //B 12 write(sockfd, sendline, strlen(sendline)); 13 shutdown(sockfd, SHUT_WR); 14 pause(); 15 return ; 16 }
上述代码来源《Unix网络编程》卷1第350页,为客户端程序。在A处fork一个进程,子进程用于接收服务端发送给sockfd的消息,父进程用于接收stdin消息并发送给sockfd。
当父进程发送消息结束后,调用shutdown命令向服务端发送FIN,并pause()停止,服务端接收FIN并发送ACK被客户端子进程接收,并调用kill向父进程发送SIGTERM信号终止父进程。如果上述代码将shutdown修改为close,则会存在如下问题:
由于套接字描述符是在父子进程之间共享的,因此在客户端fork后sockfd的引用计数为2,若父进程改为调用close(),则只是把相应描述符引用计数减1,仍然为大于0,故不会向服务端发送FIN。只有在调用close使得相应描述符引用计数为0时,才会发送FIN。而采用shutdown,则使描述符的引用计数仍然大于0但FIN也被强迫发送。
posted on 2017-10-25 14:38 chenjx_ucs 阅读(220) 评论(0) 编辑 收藏 举报