我正在学习进程间通信...这是困扰我的代码
#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] 并关闭了标准输入并用作我的 pads[0] ..但是如果一个线程在另一个线程之前退出怎么办。 . ??
4)(我使用Xcode以及gcc),当在gcc中运行上述程序时,它运行良好,但是在Xcode中运行时它显示“SIGTRAP”并在控制台中返回“1”
LZ 帮助...
PS:如果有人告诉我如何在任何一般问题中查看单独线程的执行会更好!谢谢你 !!