#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 PAGER "${PAGER:-more}"
int
main(int argc , char *argv[])
{
int n;
char line[MAXLINE];
FILE *fpin,*fpout;
if(argc!=2)
err_sys("input err");
if((fpin=fopen(argv[1],"r"))<0)
err_sys("fopen err");
if((fpout=popen(PAGER,"w"))<0)
err_sys("popen err");
while(fgets(line,MAXLINE,fpin)!=NULL)
{
n=strlen(line);
if(fputs(line,fpout)==EOF)
err_sys("fputs erro");
}
if(ferror(fpin))
err_sys("fgets errr");
if(pclose(fpout)<0)
err_sys("pclose err");
exit(0);
}
对于popen(char *cmd,int char type)而言,其先定义一个管道pfd[],然后创建子进程,在子进程里面,当type为"r"的时候,使用pfd[0]为STDOUT_FILENO,返回fpout=pfd[1],这样在父进程里面向fpout里面写数据,则在子进程里面,相当于给起标准输入写东西,然后子进程读取这些输入,并调用bash程序执行第一个参数cmd
以上程序实现了分页显示。