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

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


你可能感兴趣的:(编程,linux,null,Signal)