分页显示,linux环境,使用管道方法

#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);
	
	
}		

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值