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