Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1753678
  • 博文数量: 335
  • 博客积分: 4690
  • 博客等级: 上校
  • 技术积分: 4341
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-08 21:38
个人简介

无聊之人--除了技术,还是技术,你懂得

文章分类

全部博文(335)

文章存档

2016年(29)

2015年(18)

2014年(7)

2013年(86)

2012年(90)

2011年(105)

分类: C/C++

2012-03-12 22:55:29

  1. #include "apue.h"
  2. #include <sys/wait.h>

  3. #define DEF_PAGER "/bin/more" /* DEFAULT page program */

  4. int main(int argc,char * argv[])
  5. {
  6.     int n;
  7.     int fd[2];
  8.     pid_t pid;
  9.     char * pager,* argv0;
  10.     FILE *fp;
  11.     char line[MAXLINE];

  12.     if (argc !=2 )
  13.         err_quit("usage : a.out ");

  14.     if (( fp = fopen( argv[1],"r")) ==NULL)
  15.         err_sys("pipe error");
  16.     if (pipe(fd) < 0)
  17.         err_sys("pipe error");
  18.     if ( (pid = fork()) < 0) {
  19.         err_sys("fork error");
  20.     } else if( pid > 0) {
  21.         close(fd[0]); /* parent close read pipe */
  22.         while( fgets(line,MAXLINE,fp) != NULL) {
  23.             n = strlen(line);
  24.             if (write(fd[1],line,n) != n)
  25.                 err_sys("write error to pipe ");
  26.         }
  27.     
  28.     if (ferror(fp))
  29.         err_sys("fgets error");
  30.     close(fd[1]); /* close write end of the pipe for reader */
  31.     if (waitpid(pid,NULL,0) < 0)
  32.         err_sys("wait pid error");
  33.     exit(0);
  34.     } else {
  35.         close(fd[1]);
  36.         if (fd[0] != STDOUT_FILENO)
  37.         {
  38.             if (dup2(fd[0],STDIN_FILENO) != STDIN_FILENO)
  39.                 err_sys("dup2 error ");
  40.             close(fd[0]); /* don't need after dup2 */
  41.         }
  42.         if ( (pager = getenv("pager")) == NULL)
  43.             pager = DEF_PAGER;
  44.         if (( argv0 = strrchr(pager,'/')) !=NULL )
  45.             argv0++;
  46.         else
  47.             argv0 = pager ;
  48.         if (execl(pager ,argv0,(char * )0) < 0)
  49.             err_sys("execl error ");
  50.     }
  51.     exit(0);
  52. }
ubuntu@ubuntu-virtual-machine:~/Desktop/apue$ gcc -Wall -o c15-2 c15-2.c error.c
ubuntu@ubuntu-virtual-machine:~/Desktop/apue$ ./c15-2
usage : a.out  
ubuntu@ubuntu-virtual-machine:~/Desktop/apue$ ./c15-2  error.c
#include "apue.h"
#include /* for definition of errno */
#include /* iso c variable arguement */ 
.........................
使用管道,将文件的输出到另一个文件的分页程序
需要的注意的地方:
使用管道
waitpid的使用
使用dup2
difference:
dup(fd)
返回最小的可用的文件描述符
dup(fd1,fd2);
如果fd1== fd2 直接返回
否则首先关闭fd2 ,然后打开使用fd2文件描述符打fd1所指向的文件表项
二者共享一个文件表项
















阅读(927) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~