2010-10-22 95 views
0

我嘗試讀取使用輪詢從管道中的數據從管道讀取,這裏是代碼:使用輪詢

#include <stdio.h> 
#include <fcntl.h> 
#include <poll.h> 
#define MAX_BUFF_SIZE 128 

int main(void){ 
    char buff[MAX_BUFF_SIZE]; 
    char *buf; 
    int fd,ret,len; 
    struct pollfd fdinfo[1]; 

    if((fd = open("/home/s/pipe", O_RDONLY)) == NULL) { 
     printf("Error Opening File.\n"); 
     exit(1); 
    } 

    fdinfo[0].fd = fd; 
    fdinfo[0].events = POLLIN|POLLPRI ; 

    while(1){ 
     ret = poll(fdinfo,1,-1); 
     if (ret < 0) printf("\n\r error"); 

     if (((fdinfo[0].revents&POLLIN) == POLLIN) || ((fdinfo[0].revents&POLLPRI) == POLLPRI)){ 
      len = read(fdinfo[0].fd, buff, MAX_BUFF_SIZE); 
      if (len > 0){ 
       buff[len] = 0; 
       buf = (char *) malloc(len); 
       memcpy(buf, buff, len); 
       printf("\n read len %d\n %s",len, buf); 
       free(buf); 
      } 
     } 

    } 
    return 0; 
} 

這似乎並不很好地工作 - 每一個正確的數據後,我得到了很多的垃圾產量,但我不知道它來自哪裏。所以我即將尋求幫助。提前

+0

不要使用struct pollfd fdinfo [1]; 使用struct pollfd * fdinfo,然後對其進行解引用。更容易理解,更快=)。 – 2010-10-23 00:30:36

回答

1

如果沒有可用至少MAX_BUFF_SIZE字節

THX,len將被設置爲MAX_BUFF_SIZE,並buff[len]會寫過去的buff結束。之後,所有投注都關閉。您可以通過將MAX_BUFF_SIZE - 1傳遞給read()來解決此問題。

然而,更令人擔憂的,你是不是抄襲你memcpy()通話\0,以字節的數量,包括\0len + 1

雖然我們在這:

  • don't cast the returnmalloc()
  • 檢查從malloc()回報是不是NULL
  • 如果poll()錯誤,你還在檢查revents領域,從而贏得't be be more
  • 你的測試if (((fdinfo[0].revents&POLLIN) == POLLIN) || ((fdinfo[0].revents&POLLPRI) == POLLPRI))最好寫成if (fdinfo[0].revents & (POLLIN | POLLPRI))但是不應該有必要,因爲喲請問poll()只查找這兩個東西
+0

所有更正中的+1,除了可能是鑄造malloc()之一。按照現代標準,這不應該是一個問題,我認爲這是一個很好的提醒你正在處理什麼樣的指針。 – slezica 2010-10-22 21:10:28