gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:05:08 27 4
gpt4 key购买 nike

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

#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”

PLZ 帮助...

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

最佳答案

  1. 您的printf 正在执行。但是,它只会在您重定向 stdout 后刷新,因此它的输出不会显示在终端上。如果您想在 stderr 上查看它,请尝试使用 fprintf(stderr, ...),或者在开始弄乱文件描述符之前尝试使用 fflush(stdout)

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

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

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

关于c - fork () 和 execlp () , execlp() 之前的 printf 没有被执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14252280/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com