Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
fork()和execlp(),未执行execlp()之前的printf_C_Linux_Exec_Fork_Interprocess - Fatal编程技术网

fork()和execlp(),未执行execlp()之前的printf

fork()和execlp(),未执行execlp()之前的printf,c,linux,exec,fork,interprocess,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 stdou

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

#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; 
#包括
#包括
#包括
内部主(空)
{
int-pfds[2];
管道(pfds);
如果(!fork())
{
printf(“我是子进程\n”);
关闭(1);/*关闭正常标准输出*/
dup(pfds[1]);/*使标准输出与pfds[1]相同*/
关闭(pfds[0]);/*我们不需要这个*/
execlp(“ls”、“ls”、NULL);
} 
其他的
{
printf(“我是父进程\n”);
关闭(0);/*关闭正常标准*/
dup(pfds[0]);/*使标准DIN与pfds[0]相同*/
关闭(pfds[1]);/*我们不需要这个*/
execlp(“wc”、“wc”、“-l”、NULL);
}
返回0;
}

以下是一些问题: 1) 我同意在execlp()之后,什么都不会执行,但是我的printf()语句在execlp()之前,那么它们为什么不执行呢

2) 该程序在linux中充当管道命令 因此,它的执行方式类似于“ls | wc-l”,但系统如何知道如何执行类似于“ls | wc-l”而不是“wc-l | ls”的程序呢

3) 我认为2)问题是因为我关闭了标准输出并将其用作我的PFD[1],关闭了标准输入并将其用作我的焊盘[0]……但是如果一个线程先于另一个线程退出会怎么样

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

PLZ帮助

PS:若有人告诉我如何在任何一般问题中看到独立线程的执行,那个就更好了!! 谢谢

  • 正在执行您的
    printf
    。但是,它只有在重定向stdout后才会被刷新,因此它的输出不会显示在终端上。如果您想在stderr上看到它,请尝试
    fprintf(stderr,…)
    ,或者
    fflush(stdout)
    ,然后再开始处理文件描述符

  • 将管道的写入端连接到
    ls
    进程的stdout,将读取端连接到
    wc
    上的stdin,这样就不会产生混淆

  • 我不知道你关心的是什么。
    ls
    进程在列出目录后退出,而
    wc
    进程在输入用完并打印行数后退出。一旦包含端点的两个进程都关闭了管道(通过退出),管道将自动清理

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


  • 对于问题2,你已经知道答案(从问题3)。管道只有在两端都有螺纹的情况下才能工作。谢谢先生。。。谢谢你的帮助!!在3)中,我想问,“wc-l”是否会等待管道的读取端,即pfds[0]完全充满数据……或者它只是独立运行???即使数据很大??是的。事实上,这就是为什么这是必要的——管道的容量有限(通常为4到8千字节),因此管道读取端的进程有必要迅速消费内容。先生。。是否需要在子进程和父进程中分别使用close(pads[0])和close(pads[1])语句??没有它还能用吗??它的用途是什么?这不是必要的,但却是个好主意。两个子进程都不使用额外的文件描述符;它只是挡住了路。