【问题标题】:Reading from pipe into buffer character by character/find the size of data in pipe逐个字符从管道读入缓冲区/查找管道中数据的大小
【发布时间】:2014-04-12 14:21:26
【问题描述】:

我目前正在使用"unistd.h""sys/wait.h" 来处理我的操作系统作业。我正在尝试实现图形管道。

由于在图形管道中,一个进程的输出有可能作为输入发送到多个进程,我需要将其存储在缓冲区中并循环发送。

要从进程读取输出,我使用read() 函数。问题是,由于输出中的字符数是可变的,要么我需要逐个字符地读取它,要么以某种方式找到输出的大小。

我正在尝试第一个选项。这是我的代码

string buffer;
char temp[1];
while (/*condition*/)
{
    read (pipe[0], temp, 1);
    buffer.push_back (temp[0]);
}

我的问题是必须在循环内的条件是什么?

附:如果第二个选项更容易,那么如何检查管道中进程的输出大小?

【问题讨论】:

    标签: c++ operating-system pipe


    【解决方案1】:

    条件真的是read调用的返回:

    while (read(...) == 1) { ... }
    

    也不要忘记地址操作符,您可以使用它来代替将temp 声明为数组:

    char temp;
    while (read(pipe[0], &temp, sizeof(temp)) == sizeof(temp)) { ... }
    

    【讨论】:

    • 它会导致无限循环
    • @KudayarPirimbaev 它不应该,除非管道的写入端永远不会关闭它的结束。当(如果)它关闭管道的末端并且阅读器已读取剩余数据时,read 应该返回零。当然read 将在错误时返回-1,这两个值都与sizeof(temp) 非常不同。
    • @KudayarPirimbaev 另一种可能性是写作端根本没有写任何东西。然后read 将阻塞(即它不会返回),这看起来像是一个无限循环。打开您喜欢的搜索引擎并搜索例如“posix非阻塞描述符”了解如何使文件描述符成为非阻塞以及如何使用它。
    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    相关资源
    最近更新 更多