分享

Linux socket 编程处理EINTR错误

 心不留意外尘 2016-04-16

2008 from http://blog.sina.com.cn/s/blog_5acb430f0100aer1.html

    

在linux的socket编程中,经常要处理EINTR错误,其值为4,用strerror(errno)调用返回的错误描述为:Interrupted system call. 这里给出一个connect连接中对EINTR处理的网址:

    http://www./~david/computers/connect-intr.html

    另外转载网络上其他兄弟对EINTR错误的处理:

    1. accetp()是慢系统调用,在信号产生时会中断其调用并将errno变量设置为EINTR,此时应重新调用accept()。所以使用时应这样:(网址:http://bbs./viewthread.php?tid=36154)

        while(1)
        {
            if ((connfd = accept(....)) == -1)
            {
                if (errno == EINTR)
                {
                    continue;
                }
                perror("accept()");
                exit(1);
            }
 
            //do something with the connfd
            ......;
        }
 
        2. 引用网址 http://fanqiang./a4/b7/20010508/112052.html,其中摘引一段socket的读处理,我把排版做了相应改动:
        int my_read(int fd, void *buffer, int length)
        {
             int bytes_left;
             int bytes_read;
             char *ptr = NULL;
  
             bytes_left = length;
             while (bytes_left > 0)
             {
                 bytes_read = read(fd, ptr, bytes_read);
                 if (bytes_read < 0)
                 {
                     if (errno == EINTR)
                     {
                         bytes_read = 0;
                     }
                     else
                     {
                         return(-1);
                     }
                 }
                 else if (0 == bytes_read)
                 {
                    break;
                 }
            
                 bytes_left -= bytes_read;
                 ptr += bytes_read;
             }
        
             return(length-bytes_left);
        }
        我觉得这个只能针对阻塞模式的socket,非阻塞模式的socket好要处理EAGAIN错误。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多