2013-02-22 108 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