关于命名管道的简短阅读(matlab-> linux)

时间:2013-02-22 21:58:54

标签: c linux matlab named-pipes

我有一些我正在编写的代码,它希望通过命名管道来自Matlab程序的消息,例如“/ tmp / named_pipe_0”。我可以获取管道mkfifo并打开find,但是当C程序从管道进入read()而不是预期的5004字节时,我会得到4096,904,5000,4096等短值。我已经已经证实Matlab应该发送正确的5004字节(至少,它被告知),所以我想知道原因是什么。有人之前遇到过类似的事吗?

马特

1 个答案:

答案 0 :(得分:0)

这是预期的,管道/套接字/命名管道上的读取会在某些内容可用时立即返回数据。

如果你需要读取5004字节,你可以在一个循环中执行它,在你获得那么多字节(或发生错误或发生错误)之前将你自己的缓冲区附加到你身上

e.g。

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
}