zoukankan      html  css  js  c++  java
  • 关于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也被强迫发送。

  • 相关阅读:
    JSP EL表达式
    JSP 核心标签库
    windows查看占用端口的进程
    JSP 自定义标签
    JSON-LD
    Java 国际化
    Java Web的两种开发模式
    CSS 图片加载完成再淡入显示
    Windows 让cmd启动的程序在后台运行
    Maven使用
  • 原文地址:https://www.cnblogs.com/scu-cjx/p/7728728.html
Copyright © 2011-2022 走看看