【问题标题】:fork () and execlp () , printf before execlp() does not get executedfork () 和 execlp () , execlp() 之前的 printf 不会被执行
【发布时间】:2013-01-10 06:48:07
【问题描述】:

我正在学习进程间通信...这是困扰我的代码

#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] 并关闭了标准输入并用作我的垫 [0]..但是如果一个线程之前退出怎么办另一个.. ??

4) (我使用 Xcode 和 gcc) ,当在 gcc 中运行上述程序时,它运行良好,但是当在 Xcode 中运行时,它显示“SIGTRAP”并在控制台中返回“1”

请帮助...

PS:如果有人告诉我如何在任何一般问题中查看单独线程的执行情况会更好! 谢谢你 !!

【问题讨论】:

  • 对于问题 2,您已经知道答案(来自问题 3)。管道只有在两端都有运行的线程时才能工作。

标签: c linux exec fork interprocess


【解决方案1】:
  1. 您的printf 正在被执行。但是,它仅在您重定向标准输出后才会被刷新,因此其输出不会显示在终端上。如果您想在 stderr 上看到它,请尝试fprintf(stderr, ...),或者在开始弄乱文件描述符之前尝试fflush(stdout)

  2. 您将管道的写入端附加到ls 进程的标准输出,将读取端附加到wc 上的标准输入,因此不会造成混淆。

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

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

【讨论】:

  • 感谢先生...您的大力帮助!在 3) 中,我想问的是,“wc -l”是等到管道的读取端,即 pfds[0] 完全充满数据......还是它只是独立运行???
  • 即使数据很大 ??
  • 是的。也就是说,事实上,这正是这样做的必要性——管道的容量有限(通常为 4 到 8 KB),因此管道读取端的进程需要及时消费内容。
  • 先生.. 子进程和父进程中是否需要分别使用close(pads[0])和close(pads[1])语句??没有它它工作吗?有什么用??
  • 这不是必需的,但这是一个好主意。任何一个子进程都不使用额外的文件描述符;它只是碍事。
猜你喜欢
  • 2016-01-26
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多