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