- #include "apue.h"
- #include <sys/wait.h>
- #define DEF_PAGER "/bin/more" /* DEFAULT page program */
- int main(int argc,char * argv[])
- {
- int n;
- int fd[2];
- pid_t pid;
- char * pager,* argv0;
- FILE *fp;
- char line[MAXLINE];
- if (argc !=2 )
- err_quit("usage : a.out ");
- if (( fp = fopen( argv[1],"r")) ==NULL)
- err_sys("pipe error");
- if (pipe(fd) < 0)
- err_sys("pipe error");
- if ( (pid = fork()) < 0) {
- err_sys("fork error");
- } else if( pid > 0) {
- close(fd[0]); /* parent close read pipe */
- while( fgets(line,MAXLINE,fp) != NULL) {
- n = strlen(line);
- if (write(fd[1],line,n) != n)
- err_sys("write error to pipe ");
- }
-
- if (ferror(fp))
- err_sys("fgets error");
- close(fd[1]); /* close write end of the pipe for reader */
- if (waitpid(pid,NULL,0) < 0)
- err_sys("wait pid error");
- exit(0);
- } else {
- close(fd[1]);
- if (fd[0] != STDOUT_FILENO)
- {
- if (dup2(fd[0],STDIN_FILENO) != STDIN_FILENO)
- err_sys("dup2 error ");
- close(fd[0]); /* don't need after dup2 */
- }
- if ( (pager = getenv("pager")) == NULL)
- pager = DEF_PAGER;
- if (( argv0 = strrchr(pager,'/')) !=NULL )
- argv0++;
- else
- argv0 = pager ;
- if (execl(pager ,argv0,(char * )0) < 0)
- err_sys("execl error ");
- }
- exit(0);
- }
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所指向的文件表项
阅读(988) | 评论(0) | 转发(0) |