gpt4 book ai didi

C & bash 重定向进程通信

转载 作者:行者123 更新时间:2023-11-29 09:42:14 25 4
gpt4 key购买 nike

看看这个狂欢:

mkfifo fifo
./processA <fifo | processB >fifo

在我的进程A中,我生成了一个由进程B发送的文件。然后我想处理进程B的结果。

因此,在 A 中,我只是使用 printfs 将信息发送到 B,并将其发送到 std 输出。然后我创建一个刚刚读取(stdin)的线程。创建此线程后,我通过 printf 向 B 发送信息。

我不明白为什么整个 sh block 。读取从未收到任何内容。为什么?这两个过程分别经过测试并且运行良好。如果我不读(但我无法处理 B 输出),整个 sh 也可以完美工作(不阻塞)。

有人可以解释一下我的理解有误吗?抱歉我的英语近似。如果您有一个干净的解决方案,我也对您的解决方案感兴趣(但它更愿意了解为什么这个解决方案不起作用)。

//编辑这是主要的(过程A):

//managing some arguments threatment, constructing object...


pthread_t thread;//creation of the thread supposed to read

if(pthread_create(&thread, NULL,IsKhacToolKit::threadRead, solver) != 0) {
fprintf(stderr,"\nSomething went wrong while creating Reader thread\n" );
}
solver->generateDimacFile();//printing to stdout


pthread_exit(0);
}

线程执行的函数应该只是读取 stdin 并将获得的字符串打印到 stderr 中(目前)。现在 stderr 中没有打印任何内容。

generateDimacFile 将 char* 打印到 processB 使用的 stdout(并在最后刷新(stdout))。进程 B 是:http://www.labri.fr/perso/lsimon/glucose/

这里是线程现在执行的函数:

char* satResult=(char*)malloc(sizeof(char)* solutionSize);
for (int i=0; i<2; i++){
read(0, satResult, solutionSize );
fprintf(stderr, "\n%s\n", satResult);
}
DEBUGFLAG("Getting result from glucose");

好的,现在感谢 Maxim Egorushkin,我发现第一个读取不会阻塞,但下一个 block 使用该 bash 代替:

./processA <fifo | stdbuf -o0 ./processB >fifo

如果我使用那个:

stdbuf -o0 ./processA <fifo | stdbuf -o0 ./processB >fifo

大多数时候我可以在没有阻塞的情况下读取两次(有时它会阻塞)。我还是读不了3遍。我不明白为什么它会改变任何东西,因为我刷新了generateDimacFile中的标准输出。

看看在 stderr 中不阻塞(读取两次)时实际打印的内容:

c
c This is glucose 4.0 -- based on MiniSAT (Many thanks to MiniSAT team)
c



c This is glucose 4.0 -- based on MiniSAT (Many thanks to MiniSAT team)
c

c Reading from standard input... Use '--help' for help.
s to MiniSAT team)
c

相应的预期结果:

c
c This is glucose 4.0 -- based on MiniSAT (Many thanks to MiniSAT team)
c
c Reading from standard input... Use '--help' for help.
c | |
s UNSATISFIABLE

最佳答案

您存在潜在的阻塞竞争条件。如果 processB 在生成任何数据之前需要读取大量数据,那么 processA 在生成足够的数据之前可能会出现数据匮乏的情况。一旦发生这种情况,就会陷入僵局。或者,如果 processA 在读取某些内容之前从不生成任何数据,那么两个进程都会坐在那里。这实际上取决于 processA 和 processB 正在做什么。

如果流程足够简单,那么您正在做的事情应该可行。例如:

$ cat a.sh
#!/bin/sh

echo "$$"

while read line; do echo $(($line + 1 )); echo $$ read: $line >&2; sleep 1; done
$ ./a.sh < fifo | ./a.sh > fifo
26385 read: 26384
26384 read: 26385
26385 read: 26386
26384 read: 26385
26385 read: 26386
26384 read: 26387
26385 read: 26388
26384 read: 26387
^C

关于C & bash 重定向进程通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47059615/

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