我正在编写一些代码,这些代码期望通过命名管道(例如“/tmp/named_pipe_0”)从 Matlab 程序发出消息。我可以得到管道 mkfifo 并打开 find,但是当 C 程序从管道转到 read() 时,而不是预期的 5004 字节,我会得到短值,如 4096、904、5000、4096 等。我已经已经验证 Matlab 应该发送正确的 5004 字节(至少,它被告知),所以我想知道原因是什么。以前有人遇到过这样的事情吗?
马特
我正在编写一些代码,这些代码期望通过命名管道(例如“/tmp/named_pipe_0”)从 Matlab 程序发出消息。我可以得到管道 mkfifo 并打开 find,但是当 C 程序从管道转到 read() 时,而不是预期的 5004 字节,我会得到短值,如 4096、904、5000、4096 等。我已经已经验证 Matlab 应该发送正确的 5004 字节(至少,它被告知),所以我想知道原因是什么。以前有人遇到过这样的事情吗?
马特
这是意料之中的,只要有东西可用,对管道/套接字/命名管道的读取就会给您返回数据。
如果您需要读取 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
}