【发布时间】:2014-11-28 01:58:58
【问题描述】:
我正在尝试为 3 个进程和当前程序创建一个管道链,以便:
1 - 执行 P1 并将 P1 的输出发送到 P2 的输入
3 - 将 P2 的输出发送到 P3 的输入
4 - 在标准输出中显示 P3 的输出
5 - 将当前/主/驱动程序的标准输入传递给 P3 的输入
我正在使用 2 个管道。对于任务 #5,主程序从标准输入读取并写入 P3 读取的管道。
我已经设法让进程相互通信。然而,我注意到在 P1 写入和 P2 在其 STDIN 上检测到此写入之间存在很大延迟,即 P1 在 P2 检测到写入之前可能已经写入了数百次,并且在开始时错过了许多 P1 写入。我已经通过打印消息确认 P2 实际上是按时启动的,但是,它没有及时检测/读取输入(这是一个 Python 脚本循环:“for line in sys.stdin:”)
这是我的代码:
int pipe1[2];
int pipe2[2];
if (pipe(pipe1) < 0 || pipe(pipe2) < 0 )
{
perror("Error: pipe");
}
pid_t procIDC = fork();
if (procIDC == 0)
{
dup2(pipe2[0], 0);
execv("procC", argv);
}
else
{
pid_t procIDB ;
procIDB = fork();
if (procIDB == 0)
{
dup2( pipe1[0], 0);
dup2( pipe2[1], 1);
if (execl("/usr/bin/python", "/usr/bin/python", "./test.py", (char *)NULL) < 0)
{
perror("execl"); return 0;
}
}
else
{
pid_t procIDA = fork();
if (procIDA ==0)
{
dup2( pipe1[1], 1);
execv("proc1", argv);
}
else
{
dup2( pipe2[1], 1);
//print any input so it sends to p3
ssize_t read;
char *inputLine = NULL;
size_t len = 0;
while ((read = getline(&inputLine, &len, stdin)) != -1)
{
printf(inputLine);
}
}
}
【问题讨论】: