编写程序,实现多进程通信的综合开发。
假设函数
其中
要求:
1、父进程获取用户从终端输入的两个数字 ;
2、使用管道通信,分别将 传递给子进程1和子进程2;
3、子进程1计算函数 ,子进程2计算函数 ;
4、两个子进程分别将计算结果发送给父进程
5、父进程接收结果,计算 并完成打印。
提示:
创建四个管道,分别用于父进程——子进程1,和父进程——子进程2的全双工通信。
#include<stdio.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#define WRITE 1
#define READ 0
int main()
{
int fd1[2],fd2[2],fd3[2],fd4[2];
pid_t pid;
if(pipe(fd1))
{
printf("管道1创建失败");
exit(0);
}
if(pipe(fd2))
{
printf("管道2创建失败");
exit(0);
}
if(pipe(fd3))
{
printf("管道3创建失败");
exit(0);
}
if(pipe(fd4))
{
printf("管道4创建失败");
exit(0);
}
int i;
for(i=0;i<2;i++)
{
pid=fork();//printf("子进程pid:%d,i:%d,本进程pid:%d,父进程pid:%d\n",pid,i,getpid(),getppid());
if(pid==0||pid==-1) break;
//由fork()函数创建的新进程被称为子进程.fork()函数被调用一次,但返回两次,两次的返回值不同,子进程的返回值是0,父进程的返回值是新进程的进程ID.
}
if(i==0)
{
printf("子进程1: pid:%d\n",getpid());
close(fd1[WRITE]);
close(fd2[READ]);
int x1;
int a1;
read(fd1[READ],&x1,sizeof(int));
a1=x1*x1;//printf("a1=%d\n",a1);//从管道中将x1读出后计算,不能放在read之前
write(fd2[WRITE],&a1,sizeof(int));
printf("childx=%d\n",x1);
printf("f(x)=%d\n",a1);
close(fd1[READ]);
close(fd2[WRITE]);
exit(0);
}
if(i==1){
printf("子进程2: pid:%d\n",getpid());
close(fd3[WRITE]);
close(fd4[READ]);
int y1;
int b1=0;//printf("b1=%d\n",b1);
read(fd3[READ],&y1,sizeof(int));
b1=y1*y1*y1;
write(fd4[WRITE],&b1,sizeof(int));
printf("childy=%d\n",y1);
printf("f(y)=%d\n",b1);
close(fd3[READ]);
close(fd4[WRITE]);
exit(0);
}
if(i==2) {
printf("父进程 : pid:%d\n",getpid());
int x,y;
scanf("%d %d",&x,&y);
close(fd1[READ]);
close(fd2[WRITE]);
close(fd3[READ]);
close(fd4[WRITE]);
int a;
int b;
write(fd1[WRITE],&x,sizeof(int));
read(fd2[READ],&a,sizeof(int));
write(fd3[WRITE],&y,sizeof(int));
read(fd4[READ],&b,sizeof(int));
printf("x:%d\n",x);
printf("y:%d\n",y);
printf("f(x)+f(y)=%d\n",a+b);
close(fd1[WRITE]);
close(fd2[READ]);
close(fd3[WRITE]);
close(fd4[READ]);
exit(0);
}
return 0;
}