其他分享
首页 > 其他分享> > fork()和execlp(),不执行execlp()之前的printf

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