fork()和execlp(),exefp()之前的printf没有被执行

时间:2013-01-10 06:48:08

标签: c linux exec fork interprocess

我正在学习进程间通信......这是让我烦恼的代码

#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:如果有人告诉我如何在任何一般问题中看到单独线程的执行,那会更好!! 谢谢 !!

1 个答案:

答案 0 :(得分:4)

  1. 您的printf正在执行中。但是,它只会在重定向stdout后刷新,因此它的输出不会显示在终端上。如果您想在stderr或fprintf(stderr, ...)上查看它,请先尝试fflush(stdout)

  2. 您将管道的书写末尾附加到ls进程的标准输出,并且读取结束于wc上的标准输入,因此没有混淆。

  3. 我不确定你的顾虑是什么。 ls进程完成列出目录后退出,wc一旦输出用完就退出并打印行数。一旦持有端点的两个进程都关闭它(通过退出),管道就会自动清理。

  4. 很难说。调试器显示什么? Xcode调试环境主要是为了开发和调试桌面/移动应用程序,所以它可能只是某种侥幸。