【发布时间】:2015-04-14 12:22:12
【问题描述】:
我想在 3 个子进程之间创建两个管道,但我首先想让第一个管道 pipe1 在两个 fork 进程之间工作。问题是,当我从第一个进程复制标准输出并同样从另一个进程复制标准输入时,我没有得到输出。
int main()
{
int pipe1[2];
int pipe2[2];
pipe(pipe1);
pipe(pipe2);
sem_t mutex_pipe1;
sem_t mutex_pipe2;
sem_init(&mutex_pipe1, 0, 0);
sem_init(&mutex_pipe2, 0, 1);
if (fork()==0) { //process 1
close(1); /* close normal stdout */
dup(pipe1[1]); /* make stdout same as pfds[1] */
sem_post(&mutex_pipe1);
execlp("ls", "ls", NULL);
}
if (fork()==0){ //process 2
sem_wait(&mutex_pipe1);
close(0);
dup(pipe1[0]);
dup2(pipe1[1], 1) //want to open stdout again.
sem_post(&mutex_pipe1);
execlp("wc", "wc", "-l", NULL);
}
【问题讨论】:
-
仅供参考,
sem_post都不会看到曙光。你就在他们面前execlped。该调用替换正在运行的进程映像。 IE。没有勺子。这些将执行的唯一方法是execlp调用 failed。 -
@WhozCraig 你在回答 OP 的问题 - 你应该把它作为答案,这样我就可以投票了 ;)
-
嗯我相信我的信号量正在工作,因为在我在标准输入上调用“dup”之前,在管道上调用标准输出之前,我首先执行了“ls”并且进程挂起“wc -l”命令我想?
-
您为什么要在其中涉及信号量?对于通过管道进行通信的进程来说,它们本质上并不是必需的。实际上,管道本身就构成了一种进程间同步机制。
-
如果您想复制到特定的文件描述符,请始终使用
dup2()。不用担心目标FD是否打开;必要时会先关闭。