• Linux socket编程处理EINTR错误


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

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

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

    1. accetp()是慢系统调用,在信号产生时会中断其调用并将errno变量设置为EINTR,此时应重新调用accept()。所以使用时应这样:(网址:http://bbs.loveunix.net/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.chinaunix.net/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错误。

     

    转自:http://blog.sina.com.cn/s/blog_5acb430f0100aer1.html 

  • 相关阅读:
    Python字符编码补充
    shell脚本自动部署及监控
    【Linux】应用程序内存段布局
    【Linux】Core dump故障分析
    【Linux】GDB程序调试
    【Linux】小应用 大智慧
    【嵌入式】安装Linux系统到开发板
    【读书笔记】高效演讲
    【Linux】GCC编译
    【Linux】Linux 找回Root用户密码
  • 原文地址:https://www.cnblogs.com/hnrainll/p/2117864.html
Copyright © 2020-2023  润新知