0

是否可以使用重定向到标准输入通过命名管道读取间歇性发送的数据?

我想做的是:

$ mkfifo pipe
$ ./test < pipe

在另一个终端:

$ cat datafile > pipe
$ cat datafile > pipe

重复将信息转储到管道中。这只适用于第一次。

这是一个显示行为的测试演示程序:

int main(int argc, char *argv[]) {  
    char input_string[30];
    while(1) {
        while( cin.read(input_string, 30) || cin.gcount()!=0 ) {
            cout << "!" << endl;
        }
    }
return 1;
}

发生什么了?重定向是否仅向管道提供单个发送的内容?我已经编写了一个实际生产代码的版本,它以管道的名称作为参数并保持打开状态以便以这种方式编写,也许这就是答案。但我想知道是否有办法通过重定向来做到这一点。

4

2 回答 2

1

当您像这样从管道重定向输入时:

./test < pipe

shell 打开管道进行读取,然后启动您的程序。但是在写入者存在之前,打开管道并没有完成——也就是说,open(2)阻塞。当另一个进程打开管道写入时,原来的open调用就完成了,两者就可以通信了。当作者关闭它的管道末端时,读取端也关闭——阅读器得到一个EOF。

一旦该循环完成,您可以重新打开管道进行读取并开始另一个循环,但您必须自己做。因此,如果您正在阅读标准输入,则必须重新启动程序。或者,您可以在不同的文件描述符上重新打开管道,例如:

// Error checking omitted for expository purposes
int main(int argc, char **argv)
{
    while(1)
    {
        int fd = open("pipe", O_RDONLY);
        char buffer[30];
        int n;
        while((n = read(fd, buffer, sizeof(buffer)) > 0)
        {
            // Process input
        }
        close(fd);
    }

    return 0;
}

如果要将原始 I/O 包装在 stdioFILE*中,可以使用fdopen(3); 我不知道将文件描述符包装在 C++ 流对象中的方法,尽管它可能是可能的。

于 2012-06-21T21:10:06.583 回答
0
$ cat datafile > pipe

将数据文件的内容发送到管道和 EOF(文件结尾)。此时重定向关闭,之后推送到管道的数据不再重定向./test

于 2012-06-21T19:27:48.497 回答