Linux网络编程:read和write函数的包装


  1. #include <unistd.h>   
  2. #include <errno.h>   
  3.   
  4. ssize_t readn(int fd, void *buf, size_t count)  
  5. {  
  6.     char *strtmp;  
  7.     ssize_t reval, realcount = 0;  
  8.     strtmp = (char *)buf;  
  9.   
  10.     while (count > 0)  
  11.     {  
  12.         reval = read(fd, strtmp, count);  
  13.         if (reval < 0)  
  14.             if (errno == EINTR)  
  15.                 continue;  
  16.             else  
  17.                 return -1;  
  18.         else if (reval > 0)  
  19.         {  
  20.             count -= reval;  
  21.             strtmp += reval;  
  22.             realcount += reval;  
  23.             continue;  
  24.         }  
  25.         else  
  26.             break;  
  27.     }  
  28.       
  29.     return realcount;  
  30. }  
  31.   
  32. ssize_t writen(int fd, const void *buf, size_t count)  
  33. {  
  34.     char *strtmp;  
  35.     ssize_t reval, realcount = count;  
  36.     strtmp = (char *)buf;  
  37.   
  38.     while (count > 0)  
  39.     {  
  40.         reval = write(fd, strtmp, count);  
  41.         if (reval < 0)  
  42.             if (errno == EINTR)  
  43.                 continue;  
  44.             else  
  45.                 return -1;  
  46.   
  47.         count -= reval;  
  48.         strtmp += reval;  
  49.     }  
  50.   
  51.     return realcount;  
  52. }  
  53.   
  54. ssize_t readline(int fd, void *buf, int size)  
  55. {  
  56.     char *strtmp;  
  57.     ssize_t reval, realcount = 0;  
  58.     strtmp = (char *)buf;  
  59.   
  60.     while (size > 1)  
  61.     {  
  62.         reval = read(fd, strtmp, 1);  
  63.         if (reval < 0)  
  64.             if (errno == EINTR)  
  65.                 continue;  
  66.             else  
  67.                 return -1;  
  68.         else if (reval == 0)  
  69.             break;  
  70.         else  
  71.         {  
  72.             realcount++;  
  73.             size--;  
  74.             if (*strtmp++ == '\n')  
  75.                 break;  
  76.         }  
  77.     }  
  78.     *strtmp = '\0';  
  79.     return realcount;  
  80. }  

需要注意:readline函数是每次调用一次系统函数读取一个字节,这样导致效率很低。

相关内容