【发布时间】:2013-01-10 06:48:07
【问题描述】:
我正在学习进程间通信...这是困扰我的代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int pfds[2];
pipe(pfds);
if (!fork())
{
printf("I m the child process\n");
close(1); /* close normal stdout */
dup(pfds[1]); /* make stdout same as pfds[1] */
close(pfds[0]); /* we don't need this */
execlp("ls", "ls", NULL);
}
else
{
printf("I m the parent process\n");
close(0); /* close normal stdin */
dup(pfds[0]); /* make stdin same as pfds[0] */
close(pfds[1]); /* we don't need this */
execlp("wc", "wc", "-l", NULL);
}
return 0;
}
这些是一些问题:- 1)我同意在 execlp() 之后,什么都没有被执行,但是我的 printf() 语句在 execlp() 之前,那么为什么它们没有被执行呢??
2)程序在linux中充当管道命令 因此它像 "ls | wc -l" 一样执行,但是系统如何知道执行像 "ls | wc -l" 而不是 "wc -l | ls" .. 的程序??
3) 我认为 2) 的问题是因为我已经关闭了标准输出并将其用作我的 pfds[1] 并关闭了标准输入并用作我的垫 [0]..但是如果一个线程之前退出怎么办另一个.. ??
4) (我使用 Xcode 和 gcc) ,当在 gcc 中运行上述程序时,它运行良好,但是当在 Xcode 中运行时,它显示“SIGTRAP”并在控制台中返回“1”
请帮助...
PS:如果有人告诉我如何在任何一般问题中查看单独线程的执行情况会更好! 谢谢你 !!
【问题讨论】:
-
对于问题 2,您已经知道答案(来自问题 3)。管道只有在两端都有运行的线程时才能工作。
标签: c linux exec fork interprocess