ppipe.c文件:
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main(int argc, char *argv[]) { int pid1; int pid2;//进程号 int pipe1[2]; //存放第一个无名管道标号 int pipe2[2]; //存放第二个无名管道标号 int x; int y; int fx; int fy;// 存放要传递的整数 printf("Please input x and y\n");//输入 scanf("%d %d",&x,&y); //使用 pipe()系统调用建立两个无名管道。建立不成功程序退出,执行终止 if(pipe(pipe1) < 0){ perror("pipe not create"); exit(EXIT_FAILURE); } if(pipe(pipe2) < 0){ perror("pipe not create"); exit(EXIT_FAILURE); } //使用 fork()系统调用建立子进程,建立不成功程序退出,执行终止 if((pid1=fork()) <0){ perror("process not create"); exit(EXIT_FAILURE); } //子进程号等于 0 表示子进程在执行, else if(pid1 == 0){ //子进程负责从管道 2 的 1 端写, //所以关掉管道 1 的 1 端、0端、管道2的0端。 close(pipe1[1]); close(pipe1[0]); close(pipe2[0]); fx=Fx(x);// 进行函数运算,将函数的运算结果f(x)写入管道2的1端 printf("child pid is %d f(x)=%d (x=%d) \n",getpid(),fx,x); write(pipe2[1],&fx,sizeof(int)); //完成后关闭管道2的1端 close(pipe2[1]); exit(EXIT_FAILURE); } else{ //使用 fork()系统调用建立子进程,建立不成功程序退出,执行终止 if((pid2=fork()) <0){ perror("process not create"); exit(EXIT_FAILURE); } //子进程号等于 0 表示子进程在执行, else if(pid2 == 0){ //子进程负责从管道 1 的 1 端写, //所以关掉管道 2 的 1 端、0端、管道1的0端。 close(pipe2[1]); close(pipe2[0]); close(pipe1[0]); fy = Fy(y); //进行函数运算,将函数的运算结果f(y)写入管道1的1端 printf("child pid is %d f(y)=%d (y=%d) \n",getpid(),fy,y); write(pipe1[1],&fy,sizeof(int)); close(pipe1[1]); exit(EXIT_FAILURE); } } //父进程负责从管道 2 的 0 端读,管道 1 的 0 端读, //所以关掉管道2的1端、管道1的0端 close(pipe2[1]); close(pipe1[1]); read(pipe2[0],&fx,sizeof(int)); read(pipe1[0],&fy,sizeof(int)); printf("parent pid is %d f(x,y)=%d (x=%d,y=%d) \n",getpid(),fx+fy,x,y); close(pipe1[0]); close(pipe2[0]); //父进程执行结束 return EXIT_SUCCESS; } //计算f(x) int Fx(const int x){ if(x==1) return 1; else return Fx(x-1)*x; } //计算f(y) int Fy(const int y){ if(y==1||y==2) return 1; else return Fy(y-1)+Fy(y-2); }
makefile文件
srcs = ppipe.c
objs = ppipe.o
opts = -g -c
all: ppipe
ppipe: $(objs)
gcc $(objs) -o ppipe
ppipe.o: $(srcs)
gcc $(opts) $(srcs)
clean:
rm ppipe *.o