2013-08-23 26 views
-1

我需要知道系統調用是否讀取了整個數據。如果緩衝區中沒有數據,則默認爲read系統調用塊,但不能確保數據已被完全讀取。請讓我知道一個正確的方法來確認。如何檢查讀取系統調用是否讀取了整個數據

在手冊頁已經說read系統調用返回0當它遇到文件結束我已嘗試也和read沒有返回0可言。

wr_cnt =write(fd, "AT+CGMI\r", sizeof("AT+CGMI\r")); 

    if(wr_cnt<0) 
     perror("Write to dev failed"); 
    else 
     printf("No.of bytes written=%d\n",wr_cnt); 

    while(1) 
    { 
     //rd_cnt =read(fd, &str, 1); 
     if((rd_cnt =read(fd, &str, 1)) <=0) 
    { 
      perror("Read to dev failed"); 
      printf("error no=%d\n",errno); 
      break; 
    } 

     printf("char =%c -> hex=%x rd_cnt=%d\n",str,str,rd_cnt); 
     sleep(3); 
     str=0; 
}  

if(rd_cnt==0) 
    printf("EOF met\n"); 
+0

你想讀取文件或流? – Theolodis

+0

@mbratch:嗨,請查看附件中的代碼。 – Sachin

+0

@mbratch ... http://stackoverflow.com/questions/18399812/read-system-call-not-detecting-end-of-file/18400047?noredirect=1#comment27026567_18400047 – someone

回答

2

默認情況下,read不會回到零,表示EOF,除非它確實是文件的末尾,或者連接已關閉。如果流連接仍然打開,但現在沒有可用的數據,read只會「掛起」,直到有東西到達。

有兩種解決方案。

  1. 設置文件描述符非阻塞模式。如果沒有數據,則read將返回-1,並且errno將被設置爲EAGAINEWOULDBLOCK(當然,在任何情況下,您都應該檢查EINTR)。可能還有其他原因阻止輸入,因此您應該在短時間內重試以確保。

  2. 使用select之前閱讀。在代碼中有點冗長,但在運行時效率更高。 select只有當它可以確保後續讀取不會阻止,或它達到您的超時時纔會返回。您可以將超時解釋爲流數據的「EOF」。如果您正在閱讀來自多個流的輸入,那麼select是絕對必需的。

相關問題