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

时间:2015-09-06 12:30:15

标签: 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 (getline(&line, &size, stdin) != -1) {
        fprintf(stdout, "%s", line);
        fprintf(stderr, "%s", line);
    }
    return 0;
}

然后:

(cat file.txt | ./dup | ./consumer1.py ; ) 2>&1 | ./consumer2.py

然而,如果消费者1比消费者2快,我们就会遇到问题。例如,消费者1已经在线50,000,而消费者2在线17,000。如果我“tail -f”consumer1.py和consumer2.py的输出,我们可以看到,因为consumer2.py较慢(由于内部的繁重处理)

在时间x输出consumer1.py:

50,546
50,547
50,548
50,549
50,550
50,551
50,552

在时间x输出consumer2.py:

17,315
17,316
17,317
17,318
17,319
17,320
17,321

对于我的系统我需要两个消费者都在同一条线上,因此需要限制消费者的速度越快。它应该是某种可能的。有任何建议如何实现这一目标?也许通过信号处理或管道特定的伏都教?谢谢!

0 个答案:

没有答案