2013-02-22 83 views
0

我有一些代碼,我正在寫從MATLAB程序通過命名管道期待的消息,例如,「/ tmp目錄/ named_pipe_0」。我可以得到管道mkfifo,打開發現,但是當C程序去從管道的read(),而不是預期的5004個字節,我會得到短值像4096,904,5000,4096,等我有已經證實,Matlab應該發送正確的5004字節(至少,它被告知),所以我想知道原因是什麼。任何人都會碰到類似這樣的事情?命名管道(matlab-> Linux)的短讀

馬特

回答

0

這是預期,在管道/插座/命名管道的讀取,只要事情是可以給你回的數據。

如果你需要閱讀5004字節,你會做一個循環,你附加你自己的緩衝區起來,直到你得到很多字節(或錯誤或出現EOF時)

例如

size_t readn(int fd, void *buf, ssize_t len) 
{ 
    ssize_t tot = 0; 
    unsigned char *p = buf; 

    while (tot != len) { 
     ssize_t r = read(fd, p + tot, len - tot); 
     if (r == 0) //premature end of reading 
      break; 
     else if (r == -1) //error 
      return -1 
     tot += r; 
    } 

    return tot; 
} 

... 
char buf[5004]; 
if (readn(pipe_fd, buf, sizeof buf) != sizeof buf) { 
    // something went bad 
} else { 
    //got all the 5004 bytes 
} 
+0

或者,只是使用'fread'。 – 2013-02-22 22:12:28

+0

謝謝,不,我會試一試。 @WilliamPursell - 我以爲FREAD()是爲* FILE,不是int文件描述符,或者是有一些微妙的變型,我不知道的? – tranzmatt 2013-02-25 15:27:09

+0

'fread'確實用於FILE *。而不是試圖實現使用''read'的fread'的功能,這是更簡單獲取文件*用'fdopen'。 – 2013-02-25 16:18:38