论坛风格切换切换到宽版
  • 571阅读
  • 0回复

[问题求助]unix 管道问题 [复制链接]

上一主题 下一主题
 
发帖
1928
C币
-235601
威望
357
贡献值
1
银元
-5
铜钱
4330
人人网人气币
0
只看楼主 倒序阅读 使用道具 楼主  发表于: 2009-05-01
下述代码摘自《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)中确实显示了父进程数据,那么父子进程是怎样通信的?.
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
快速回复
限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
上一个 下一个