linux 学习之管道

#include "apue.h"
#include <sys/wait.h>
#define DEF_PAGER "/bin/more"
int main (int argc, char *argv[])
{
 int n;
 int fd[2];
 pid_t pid;
 char *pager, *argv0;
 char line[MAXLINE];
 FILE *fp;
 if (argc !=2)//命令行参数不为2时执行printf
  {
   printf("usage:a.out<pathmane>\n");
  }
 if ((fp = fopen(argv[1], "r")) == NULL)//以只读的方式打开文件,argv[1] 文件路径/文件名
  {
   printf("cann't open %d\n", argv[1]);//如果文件不存在,执行printf
  }
 if (pipe(fd) < 0)//建立管道
  printf("pipe error\n");
 if ((pid = fork()) < 0)//创建子进程
 //调用fork()后,便有两个进程同时进行,一起执行 if ((pid = fork()) < 0)后的程序?
 //fork()返回值有两个 在子进程中返回值为0
 //在父进程中返回值为子进程ID
 //用pid的值是0 还是子进程id  区分哪些代码段是有父进程执行,哪些由子进程执行
  printf("fork error");
 else if (pid > 0)//父进程
  {
    close (fd[0]);// 父进程中关闭读,父进程向管道中写
    while (fgets (line, MAXLINE, fp) != NULL) //从fp指向的文件每次读MAXLINE个字符到line中
     {
      n = strlen(line); //不计算结尾的"/0"
      if (write(fd[1], line, n) !=n)//将line中的n个字符写向管道
       printf("write error to pipe");
     }
    if (ferror(fp))//如果ferror返回值为0(假),表示未出错。如果返回一个非零值,表示出错
     printf("fgets error");
    close (fd[1]);
    if (waitpid(pid, NULL, 0) < 0)//等待子进程结束,正常结束返回子进程id
     //waitpid函数中pid == -1 等待任意子进程,
     //pid > 0 等待期进程id 与pid相等的子进程
     //pid == 0 等待其进程组ID等于调用进程组ID的任意子进程
     //pid < -1 等待其进程组ID等于pid绝对值的任一子进程
     printf("waitpid error");
    exit(0);
    //write (fd[1], "hello world\n", 12);
  }
  else
  {
   close (fd[1]);//关闭写,子进程从管道中读
   if (fd[0] != STDIN_FILENO)//标准输入
   {
    if (dup2(fd[0], STDIN_FILENO) != STDIN_FILENO)
     // dup2 复制文件描述符,用来重定向进程的stdin stdout stderr
     printf("dup2 error to stdin");
    close(fd[0]);//关闭读
   }
   if ((pager = getenv("PAGER")) == NULL)//从环境中取字符串,获取环境变量的值“PAGER巍蔽肪潮淞棵?
    pager = DEF_PAGER;
   if ((argv0 = strrchr(pager, '/')) != NULL)
    //strrchr的作用是查找一个字符在某个字符串中最后一次出现的位置,并返回从字符串中的这个位置起一直到字符串结束的所有字符,如果未找到返回NULL
    argv0++;
   else
    argv0 = pager;
   if (execl(pager, argv0, (char *)0) < 0)
    printf("execl error for %s\n", pager);
   //n = read (f[0], line, MAXLINE);
   //write (STDOUT_FILENO, line, n);
   exit(0); 
  }
}

posted on 2012-07-06 15:11  龙沙宝石  阅读(310)  评论(0编辑  收藏  举报

导航