Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将stdin复制到stdout和stderr(已同步)_C_Stdout_Stdin_Stderr_Duplicate Data - Fatal编程技术网

C 将stdin复制到stdout和stderr(已同步)

C 将stdin复制到stdout和stderr(已同步),c,stdout,stdin,stderr,duplicate-data,C,Stdout,Stdin,Stderr,Duplicate Data,我需要复制一个制作人的标准输出,并以同步的方式将其提供给两个消费者 consumer 1 producer | duplicator | consumer 2 这可以很容易地实现,例如,通过一个dup.c程序来完成这项工作: #include <stdio.h> int main() { char *line = NULL; size_t size; while

我需要复制一个制作人的标准输出,并以同步的方式将其提供给两个消费者

                        consumer 1
producer | duplicator | 
                        consumer 2
这可以很容易地实现,例如,通过一个dup.c程序来完成这项工作:

#include <stdio.h>
int main()
{
    char *line = NULL;
    size_t size;
    while (getline(&line, &size, stdin) != -1) {
        fprintf(stdout, "%s", line);
        fprintf(stderr, "%s", line);
    }
    return 0;
}
但是,如果耗电元件1比耗电元件2快,则会出现问题。例如,消费者1已经在第50000行,而消费者2在第17000行。如果我将consumer1.py和consumer2.py的输出设为“tail-f”,我们可以看到这一点,因为consumer2.py的速度较慢(由于内部处理繁重)

在时间x时输出consumer1.py:

50,546
50,547
50,548
50,549
50,550
50,551
50,552
17,315
17,316
17,317
17,318
17,319
17,320
17,321
在时间x时输出consumer2.py:

50,546
50,547
50,548
50,549
50,550
50,551
50,552
17,315
17,316
17,317
17,318
17,319
17,320
17,321

对于我的系统,我需要两个消费者在同一条线上,因此需要限制更快的消费者。这应该是可能的。有什么建议可以实现这一点吗?可能通过信号处理或管道特定巫毒?谢谢

这里有很多未知数。为什么需要同步消费者?他们生产什么?为什么不能将消费者组合成一个单一的程序?如果消费者如此需要,为什么他们之间不能同步呢?顺便说一句,有一个命令行实用工具
tee
可以做同样的事情。你可以自己编写一个python脚本来做你想做的事情。如果使用一个小python脚本,您的速度要快10倍,那么为什么还要浪费时间让shell pipes完成您的任务呢?您不需要
dup.c
,您应该使用
tee(1)
。依靠常用的UNIX工具,不要编写这样的自定义小程序。现在,谈谈你的具体问题:我不认为你可以在不改变生产者代码或消费者代码的情况下做到这一点。如果更改代码,使两个使用者在同一进程中但在不同的线程中运行,则可以将使用者与pthread barriers(或python中的等效程序)同步。或者,您可以更改生产商,使其仅在两个消费者都确认该生产线已完成处理后才能发出新数据。谢谢@mojuba。以下是一些答案:我希望consumer1在特定的行数之后杀死consumer2。consumer2是一个二进制文件,我无法更改。consumer1是我自己的程序。生产者生成以\n结尾的字符串。我知道这项工作有tee和其他一些解决方案。谢谢@BitTickler。我知道可以通过python和子流程将Replicator的标准输出绑定到consumer1,将Replicator的标准输出绑定到consumer2。事实上,我是这样做的。为了简单解释,我没有在这里写这篇文章。