#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <string.h>
#define DEF_PAGER "/bin/more"
#define MAXLINE 4096
int main(int argc,char **argv){
int n;
int fd[2];
pid_t pid;
char *pager,*argv0;
char line[MAXLINE];
FILE *fp;
if(argc != 2)
printf("GS");
if((fp = fopen(argv[1],"r"))==0)
printf("Fopen()");
if(pipe(fd)<0)
perror("pipe");
if((pid = fork())<0){
perror("fork()");
}else if(pid == 0){
puts("aaaa1");
close(fd[1]);
if(fd[0] != STDIN_FILENO){
if(dup2(fd[0],STDIN_FILENO) != STDIN_FILENO)
perror("dup2 error to stdin");
close(fd[0]);
}
if((pager = getenv("PAGER"))<0)
pager = DEF_PAGER;
if((argv0 = strrchr(pager,'/'))!=NULL)
argv0++;
else
argv0 = pager;
puts("aaa3");
if(execl(pager,argv0,(char *)0)<0)
perror("execl");
puts("aaaaaa2");
}else{
close(fd[0]);
//dup2(fd[1],STDOUT_FILENO);
while(fgets(line,MAXLINE,fp)!=NULL){
n = strlen(line);
if(write(fd[1],line,n) != n)
perror("write");
}
if(ferror(fp))
perror("fgets");
close(fd[1]);
if(waitpid(pid,NULL,0)<0)
perror("waitpid");
printf("aaaaaaaaaaaaa\n");
exit(0);
}
return 0;
}
#include <errno.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <string.h>
#define DEF_PAGER "/bin/more"
#define MAXLINE 4096
int main(int argc,char **argv){
int n;
int fd[2];
pid_t pid;
char *pager,*argv0;
char line[MAXLINE];
FILE *fp;
if(argc != 2)
printf("GS");
if((fp = fopen(argv[1],"r"))==0)
printf("Fopen()");
if(pipe(fd)<0)
perror("pipe");
if((pid = fork())<0){
perror("fork()");
}else if(pid == 0){
puts("aaaa1");
close(fd[1]);
if(fd[0] != STDIN_FILENO){
if(dup2(fd[0],STDIN_FILENO) != STDIN_FILENO)
perror("dup2 error to stdin");
close(fd[0]);
}
if((pager = getenv("PAGER"))<0)
pager = DEF_PAGER;
if((argv0 = strrchr(pager,'/'))!=NULL)
argv0++;
else
argv0 = pager;
puts("aaa3");
if(execl(pager,argv0,(char *)0)<0)
perror("execl");
puts("aaaaaa2");
}else{
close(fd[0]);
//dup2(fd[1],STDOUT_FILENO);
while(fgets(line,MAXLINE,fp)!=NULL){
n = strlen(line);
if(write(fd[1],line,n) != n)
perror("write");
}
if(ferror(fp))
perror("fgets");
close(fd[1]);
if(waitpid(pid,NULL,0)<0)
perror("waitpid");
printf("aaaaaaaaaaaaa\n");
exit(0);
}
return 0;
}