我正在学习进程间通信......这是让我烦恼的代码
#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)问题是因为我关闭了stdout并将其用作我的pfds [1]并关闭stdin并用作我的pad [0] ..但如果一个线程退出之前怎么办?另一个.. ??4)(我使用Xcode和gcc),当在gcc中运行上述程序时,它运行良好,但在Xcode中运行时显示“SIGTRAP”并在控制台中返回“1”
PLZ帮助......
PS:如果有人告诉我如何在任何一般问题中看到单独线程的执行,那会更好!! 谢谢 !!答案 0 :(得分:4)
您的printf
正在执行中。但是,它只会在重定向stdout后刷新,因此它的输出不会显示在终端上。如果您想在stderr或fprintf(stderr, ...)
上查看它,请先尝试fflush(stdout)
。
您将管道的书写末尾附加到ls
进程的标准输出,并且读取结束于wc
上的标准输入,因此没有混淆。
我不确定你的顾虑是什么。 ls
进程完成列出目录后退出,wc
一旦输出用完就退出并打印行数。一旦持有端点的两个进程都关闭它(通过退出),管道就会自动清理。
很难说。调试器显示什么? Xcode调试环境主要是为了开发和调试桌面/移动应用程序,所以它可能只是某种侥幸。