下述代码摘自《unix.环境高级编程.》 14章 进程通信投资
#include. <sys./wait.h>.
#.include "o.urhdr.h" 鲜花
#define DEF_PAGER "/usr./bin/..less" /* default pager program */.
int
m.ain(int argc, char *ar.gv[]) 杀毒
{
. int . n, fd[2];--- 印刷
pid_t pid.;.
char . line[MAXLINE], *pag.er, *argv0; 乙肝
. FILE *fp;域名
.if (argc != 2).
. { 电子
err_sys("usage:. a.out <pathname>."); 婚庆
. exit (0).;.
. }电影
.if ( (fp .= fopen(argv[1], "r")) == NULL) 女人
er.r_sys("can't open %s", argv[1.]); 汽车
if (p.ipe(fd) < 0).
. err_sys(".pipe error");外贸
if ( (.pid = fork.()) < 0)电脑
err_sy.s("fork error".);(广告)
else if (pid > 0) { . . . /* parent */ 乙肝
. close(fd[0]); /*. close read end */( 游戏 )
. /* parent copies argv.[1] to pipe */.
while (fgets(l.ine, MAXLINE, fp) != NULL) .{服务器
n = st.rlen(l.ine);<性病>
if (writ.e(f.d[1], line, n) != n)学习
. . err_sys("write error to pipe");域名
.} 建材
. .if (ferror(fp)).
. err_sys("fgets err.or");( 游戏 )
close(fd.[1]); /* close write end of pi.pe for rea.der */电脑
. .if (waitpid(pid, NULL, 0) < 0)--- 印刷
. err_sys("waitpid .error"); 婚庆
. exit(0);.
} else { . . . /* child */教育
. close(fd[1]); . /* close write end */域名
if (fd[0] !=. STDIN_FILENO.) {外贸
if (du..p2(fd[0], STDIN_FILENO) != STDIN_FILENO)--- 印刷
. err_s.ys("dup2 error to stdin");.
c.lose(fd[0]); /* do.n't need. this after dup2 */ 女人
. }教育
. /* get arg.uments for execl() */[成人用品]
. if ( (pager = getenv("PAGER").) == NULL) 建材
. . pager = DEF_PAGER;.
.if ( (argv0 = strrchr.(pager, '/')) != NULL)教育
. . argv0++; . /* step past rightmost slash */.
. else.
. argv0 = pager; /* no s.lash in pager */服务器
if (execl(.pager, argv0, (char *) 0) < 0.) 婚庆
. err_sys("execl error for .%s", pager); 女人
}
}
本人有一处不明白,在调用了if (dup2(fd[0], STDIN_FILENO) != STDIN_F.ILENO)函数后,子进程并没有从管道中读取父进程写入的数据,在if (execl(page.r., argv0, (char .*) 0) < 0)中确实显示了父进程数据,那么父子进程是怎样通信的?.