pipe 和 dup2运用理解

fs_te_ming 2012-06-28 06:41:32
最近新学习pipe和dup2一起运用,下面的输出搞不明白是怎么来的
程序源代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main( )
{
int pfds[2];
if( pipe(pfds)==0 )
{
if( fork()==0 )
{
//close(1);
printf("child.\n");
dup2( pfds[1],1);
close( pfds[0]);
printf("child close read.\n");
execlp( "ls","ls","-l",NULL );
printf("child end.\n");
}
else
{
//close(0);
printf("parent.\n");
dup2(pfds[0],0);
close(pfds[1]);
printf("parent close write.\n");
execlp( "wc","wc","-l",NULL );
printf("parent end.\n");
}
}
return 0;
}

输出结果:
parent.
parent close write.
child.
65

为什么parent end 没有输出?还有65是怎么输出来的?整个的执行顺序是怎样?
请各位大侠指教!
...全文
280 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fs_te_ming 2012-06-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

谢谢fdl19881的回复,其他的都弄明白了,除了以下
其他代码不变,注释
1)
printf("child close read.\n");
//execlp( "ls","ls","-l",NULL );
//printf("child end.\n");
得到统计结果:1
2)
//printf("child close read.\n");
//execlp( "l……
[/Quote]

我指的是1),3)和5)不太明白,谢谢
fs_te_ming 2012-06-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

exec函数族执行的时候,是用新的进程替换了原来的进程,,,原来进程在exec后面的代码就。。。。。
[/Quote]

我指的是1),3)和5)不太明白,谢谢
fs_te_ming 2012-06-29
  • 打赏
  • 举报
回复
谢谢fdl19881的回复,其他的都弄明白了,除了以下
其他代码不变,注释
1)
printf("child close read.\n");
//execlp( "ls","ls","-l",NULL );
//printf("child end.\n");
得到统计结果:1
2)
//printf("child close read.\n");
//execlp( "ls","ls","-l",NULL );
//printf("child end.\n");
得到统计结果:0
3)
printf("child close read.\n");
//execlp( "ls","ls","-l",NULL );
printf("child end.\n");
得到统计结果:2
4)
//printf("child close read.\n");
execlp( "ls","ls","-l",NULL );
//printf("child end.\n");
得到统计结果:65
5)
printf("child close read.\n");
execlp( "ls","ls","-l",NULL );
//printf("child end.\n");
得到统计结果:65
这些结果到底是怎么统计出来的?谢谢。。。
查了挺多资料,都没搞明白
Arnold9009 2012-06-28
  • 打赏
  • 举报
回复
exec函数族执行的时候,是用新的进程替换了原来的进程,,,原来进程在exec后面的代码就。。。。。
qq120848369 2012-06-28
  • 打赏
  • 举报
回复
因为子进程跑的程序跑完就exit了。
fdl19881 2012-06-28
  • 打赏
  • 举报
回复
printf("child end.\n");
printf("parent end.\n");
这两句没输出是因为程序根本不可能执行到这里来!前面说了execple是不会返回的。搜索下这个的作用。



printf("child.\n");不可能没输出。
如果没输出 , 是因为你上一句close(1)了。。也就是你测试的时候有close(1). 你帖出来的代码却没有close(1), 被你注释。你好好试试。
Ever_lover 2012-06-28
  • 打赏
  • 举报
回复
好好看看 dup2这个函数 一木料热
fs_te_ming 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
最近新学习pipe和dup2一起运用,下面的输出搞不明白是怎么来的
程序源代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main( )
{
int pfds[2];
if( pipe(pfds)==0 )
{
if( fork()==0 )
{
……
[/Quote]

我想知道,是怎么输出结果的,如果可以理解为最后的ls -l | wc -l是输出到标准输出,为什么其中的好几条printf没有成功的输出
fdl19881 2012-06-28
  • 打赏
  • 举报
回复
execlp( "wc","wc","-l",NULL );
这个是65的来历。

新建一个pipe,标准输入和标准输出被分别重定向到pipe建立的fd[0]和fd[1]。

子进程和父进程都调用了execlp, 这个函数是不会返回的。
子进程和父进程由此改头换面。分别变成程序ls和wc了。
子进程的ls -l执行的结果向1输出,然后传到父进程
父进程从0读数据(即管道),然后使用wc -l得到输入数据有多少行。

linux上的。 基础问题,学学APUE就全明白了。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧