【问题标题】:Short read on named pipes (matlab->linux)命名管道短读(matlab->linux)
【发布时间】:2013-02-22 21:58:54
【问题描述】:

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

马特

【问题讨论】:

    标签: c linux matlab named-pipes


    【解决方案1】:

    这是意料之中的,管道/套接字/命名管道上的读取会在某些可用时立即返回数据。

    如果你需要读取 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
    }
    

    【讨论】:

    • 谢谢,不,我会试一试。 @WilliamPursell - 我认为 fread() 是用于 *FILE,而不是 int 文件描述符,还是有一些我不知道的微妙变体?
    • fread 确实适用于 FILE *。与其尝试使用read 来实现fread 的功能,不如使用fdopen 获得一个FILE * 要简单得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多