目录
一、问题
查看文件 : cat 文件名 | more
利用兄弟进程模拟查看文件过程 ./sibpipe cat sibpipe.cpp more
二、代码演示
1、sibpipe.cpp
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>
#include"client.h"
#include"server.h"
#include"mysig.h"
int main(int argc,char* argv[]){
signal(SIGCHLD,handle_child);
int fd[2];
pipe(fd);
int i=0;
for(;i<2;i++){
pid_t child=fork();
if(child==0) break;
}
if(i==0){
close(fd[0]);
client(fd[1],argv[1],argv[2]);
exit(0);
}else if(i==1){
close(fd[1]);
server(fd[0],argv[3]);
exit(0);
}else{
close(fd[0]);
close(fd[1]);
while(true){
}
}
return 0;
}
2、server.h
void server(const int rfd,const char* cmd);
3、server.cpp
#include<unistd.h>
#include"server.h"
void server(const int rfd,const char* cmd){
dup2(rfd,0);
execlp(cmd,cmd,NULL);
}
4、client.h
void client(const int wfd,const char* cmd,const char* param);
5、client.cpp
#include<unistd.h>
#include"client.h"
void client(const int wfd,const char* cmd,const char* param){
dup2(wfd,1);
execlp(cmd,cmd,param,NULL);
}
6、mysig.h
void handle_child(int signo);
7、mysig.cpp
#include<iostream>
#include<sys/types.h>
#include<sys/wait.h>
#include"mysig.h"
void handle_child(int signo){
pid_t child;
while((child=waitpid(-1,NULL,WNOHANG)) > 0){
std::cerr<<child<<" finish\n";
}
}
8、sib.mk
GCC=g++
CFLAG=-c
OFLAG=-o
EXE=sibpipe
OBJ=sibpipe.o server.o client.o mysig.o
${EXE}:${OBJ}
${GCC} ${OFLAG} $@ $^
%.o:%.cpp
${GCC} ${CFLAG} $^
clean:
rm *.o
三、运行结果