fork()和execlp(),不执行execlp()之前的printf
作者:互联网
我正在学习进程间通信…这是困扰我的代码
#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并将其用作我的pads [0] ..但是,如果一个线程在另一个线程之前退出,该怎么办. ??
4)(我同时使用Xcode和gcc),在gcc中运行上述程序时,效果很好,但是在Xcode中运行时,它显示“ SIGTRAP”,并在控制台中返回“ 1”
PLZ帮助…
PS:如果有人告诉我在任何一般性问题中如何看待单独线程的执行,那就更好了!
谢谢 !!
解决方法:
>您的printf正在执行.但是,仅在重定向stdout之后才刷新它,因此其输出不会显示在终端上.如果要在stderr上查看它,请尝试fprintf(stderr,…),或者在开始弄乱文件描述符之前尝试fflush(stdout).
>您将管道的写入端连接到ls进程的标准输出,并将读取端连接到wc上的stdin,因此不会造成混乱.
>我不确定您关心的是什么. ls进程在完成目录列出后退出,而wc在其输入用尽并显示行数时退出.一旦拥有端点的两个进程都将其关闭(通过退出),便会自动清理管道.
>很难说.调试器显示什么?但是,Xcode调试环境主要用于开发和调试台式机/移动应用程序,因此它可能只是某种偶然.
标签:interprocess,exec,c-3,linux,fork 来源: https://codeday.me/bug/20191031/1975554.html