管道实现处理分工,实现两数想加 linux环境高级编程

来源:互联网 发布:计算机java二级考试 编辑:程序博客网 时间:2024/05/29 11:45

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