0

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

马特

4

1 回答 1

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
}
于 2013-02-22T22:06:25.697 回答