writen()和readn()函數

寫函數write 
#include <unistd.h>
ssize_t write(int fildes,const void *buf,size_t nbyte) 

write函數將buf中的nbyte字節內容寫入文件描述符fd引用的打開文件中,成功時返回寫的字節數,失敗時返回-1。 並設置errno變量. 在網絡程序中,當我們向套接字文件描述符寫時有兩種可能. 
1)write的返回值大於0,表示寫了部分或者是全部的數據. 
2)返回的值小於0,此時出現了錯誤.我們要根據錯誤類型來處理. 
如果錯誤爲EINTR表示在寫的時候出現了中斷錯誤. 
如果爲EPIPE表示網絡連接出現了問題(對方已經關閉了連接). 

爲了處理以上的情況,我們自己編寫一個寫函數來處理這幾種情況. 
  1. ssize_t writen (int fd, const void *buf, size_t num)  
  2. {  
  3. ssize_t res;  
  4. size_t n;  
  5. const char *ptr;  
  6.   
  7.   
  8. n = num;  
  9. ptr = buf;  
  10. while (n > 0) {  
  11. /* 開始寫*/   
  12.      if ((res = write (fd, ptr, n)) <= 0) {  
  13.       if (errno == EINTR)  
  14.        res = 0;  
  15.       else  
  16.        return (-1);  
  17.      }  
  18.   
  19.   
  20.      ptr += res;/* 從剩下的地方繼續寫     */   
  21.      n -= res;  
  22. }  
  23.   
  24.   
  25. return (num);  
  26. }  
ssize_t writen (int fd, const void *buf, size_t num)
{
ssize_t res;
size_t n;
const char *ptr;


n = num;
ptr = buf;
while (n > 0) {
/* 開始寫*/ 
     if ((res = write (fd, ptr, n)) <= 0) {
      if (errno == EINTR)
       res = 0;
      else
       return (-1);
     }


     ptr += res;/* 從剩下的地方繼續寫     */ 
     n -= res;
}


return (num);
}

讀函數read 
ssize_t read(int fildes,void *buf,size_t nbyte) read函數是負責從fd引用的打開文件中讀取nbyte字節到buf指向的緩衝區,成功返回實際所讀的字節數,如果返回的值是0 表示已經讀到文件的結束了。小於0表示出現了錯誤。如果錯誤爲EINTR說明讀是由中斷引起的, 如果是ECONNREST表示網絡連接出了問題。可能read讀取的字節數少於要求的nbyte字節,有很多原因:1從規則文件中讀取,從終端讀取通常是每次讀取一行,從TCP套接字讀取根據如何接受包可以返回的任意字節數。 和上面一樣,我們也寫一個自己的讀函數。

  1. ssize_t readn (int fd, void *buf, size_t num)  
  2. {  
  3. ssize_t res;  
  4. size_t n;  
  5. char *ptr;  
  6.   
  7.   
  8. n = num;  
  9. ptr = buf;  
  10. while (n > 0) {  
  11.      if ((res = read (fd, ptr, n)) == -1) {  
  12.       if (errno == EINTR)  
  13.        res = 0;  
  14.       else  
  15.        return (-1);  
  16.      }  
  17.      else if (res == 0)  
  18.       break;  
  19.   
  20.   
  21.      ptr += res;  
  22.      n -= res;  
  23. }  
  24.   
  25.   
  26. return (num - n);  
  27. }  
ssize_t readn (int fd, void *buf, size_t num)
{
ssize_t res;
size_t n;
char *ptr;


n = num;
ptr = buf;
while (n > 0) {
     if ((res = read (fd, ptr, n)) == -1) {
      if (errno == EINTR)
       res = 0;
      else
       return (-1);
     }
     else if (res == 0)
      break;


     ptr += res;
     n -= res;
}


return (num - n);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章