#include <fcntl.h>
#include <stdio.h>
#include "apue.h"
#include <errno.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <stropts.h>
#include <sys/mman.h>
#define DEF_PAGER "/bin/more"
int
main(int argc , char *argv[])
{
int n, fd[2];
pid_t pid;
char *argv0,*pager;
char line[MAXLINE];
FILE *fp;
if(argc!=2)
err_sys("usage erro;");
if((fp=fopen(argv[1],"r"))<0)
err_sys("open argv[1] erro");
if(pipe(fd)<0)
err_sys("pipe erro");
if((pid=fork())<0)
err_sys("fork erro");
else if(pid>0)
{
close(fd[0]);
while(fgets(line,MAXLINE,fp)!=NULL)
{
n=strlen(line);
if(write(fd[1],line,n)!=n)
err_sys("write fd[0] errr");
}
if(ferror(fp))
err_sys("fgets err");
close(fd[1]);
if(waitpid(pid,NULL,0)<0)
err_sys("waitpid err");
exit(0);
}
else{
close(fd[1]);
if(fd[0]!=STDIN_FILENO)
{
if(dup2(fd[0],STDIN_FILENO)!=STDIN_FILENO)
err_sys("dup2 fd[0] erro");
close(fd[0]);
}
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 erro");
}
exit(0);
}
分页显示,linux环境,使用管道方法
最新推荐文章于 2024-04-25 21:52:22 发布