add2,这个实现两个数相加,编译成add2
#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> int main(int argc , char *argv[]) { int n,int1,int2,int3; char line[MAXLINE]; while((n=read(STDIN_FILENO,line,MAXLINE))>0) { line[n]=0; if(sscanf(line,"%d%d%d",&int1,&int2,&int3)==3) { sprintf(line,"%d\n",int1+int2+int3); n=strlen(line); if(write(STDOUT_FILENO,line,n)!=n) err_sys("write 1 erro"); } else{ if(write(STDOUT_FILENO,"invalid args\n",13)!=13) err_sys("write 2erro"); } } exit(0); }
父进程 pipe 子进程
fd2[0] <----- fd2[1]=STDOUT_FILENO 读过程
fd1[1] -----> fd1[0]=STDIN_FILENO 写过程
以下程序使用管道。子进程负责处理,并exel (add2)程序,并吧处理完的数据通过管道 fd2[1]发送给父进程
#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> static void sig_pipe(int signo) { printf("SIGPIPE has been received\n"); exit(1); } int main(int argc , char *argv[]) { int n,fd1[2],fd2[2]; char line[MAXLINE]; pid_t pid; if(signal(SIGPIPE,sig_pipe)<0) err_sys("pipe erro"); if(pipe(fd1)<0||pipe(fd2)<0) err_sys("pipe err"); if((pid=fork())<0) err_sys("fork err"); else if(pid>0) { close(fd1[0]); close(fd2[1]); while(fgets(line,MAXLINE,stdin)!=NULL) { n=strlen(line); if(write(fd1[1],line,n)!=n) err_sys("parent write fd1[1] erro"); if((n=read(fd2[0],line,MAXLINE))<0) err_sys("parent read fd2[0] erro"); n=strlen(line); if(n==0) break; line[n]=0; if(fputs(line,stdout)==EOF) err_sys("parent 2 write stdout err"); } exit(1); } else { close(fd2[0]); close(fd1[1]); if(fd2[1]!=STDOUT_FILENO) { if(dup2(fd2[1],STDOUT_FILENO)<0) err_sys("dup2 fd2[1] erro"); close(fd2[1]); } if(fd1[0]!=STDIN_FILENO) { if(dup2(fd1[0],STDIN_FILENO)<0) err_sys("dup2 fd1[0] erro"); close(fd1[0]); } if(execl("./add2","add2",(char *)0)<0) err_sys("execl erro"); } exit(0); }