gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:31:15 26 4
gpt4 key购买 nike

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

我想做的是:

$ 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;
}

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

最佳答案

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

./test < pipe

Shell 打开管道进行读取,然后启动您的程序。但是打开管道直到编写器存在才完成——也就是说,open(2) block 。当另一个进程打开管道进行写入时,原始的 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 包装在一个 stdio FILE* 中,你可以使用 fdopen(3) ;我不知道有什么方法可以将文件描述符包装在 C++ 流对象中,尽管它可能是可行的。

关于c++ - 是否可以使用重定向到标准输入通过命名管道读取间歇性发送的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11145109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com