要求:
进程间通信编程
功能:1、父进程创建子进程1
2、父进程从键盘上接受5个数据,对其求和sum1
3、子进程对这5个数求平方和sum24、sum2传给父进程,父进程计算 sum1+sum2,并显示结果。
说明:
1、可以用一个程序(pipe)或两个程序完成
2、数据的传递用大小为10byte的共享内存区实现
3、子进程用消息队列将sum1传给父进程
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define KEY 100
#define SIZE 5
struct msgform{
long mtype;
char mtext[100];
}msg,smsg;
int main(){
int num[SIZE];
int shmid,i;
char *shmaddr;
int sum=0;
int *p;
int x;
int msgid;
//use shm to deliver data
shmid=shmget(KEY,sizeof(int)*SIZE,0777|IPC_CREAT);
if(shmid==-1){
printf("shmget erroe!\n");
return;
}
shmaddr=shmat(shmid,NULL,0);
p=(int *)shmaddr;
//input data
for(i=0;i<SIZE;i++){
printf("Input number %d:",i+1);
scanf("%d",p++);
}
p=p-5;
//compute sum of the five numbers
for(i=0;i<SIZE;i++){
sum+=*p++;
}
printf("SUM:%d\n",sum);
//use msg queue to deliver result
msgid=msgget(KEY+1,0777|IPC_CREAT);
if(msgid==-1){
printf("msgget error!");
return;
}
if((x=fork())==-1){
printf("fork error!\n");
return;
}
if(x==0){// child process
int sum_power2=0;
p=p-5;
for(i=0;i<SIZE;i++){
int temp=*p++;
sum_power2=sum_power2+temp*temp;
}
//send data
smsg.mtype=1;
sprintf(smsg.mtext,"%d",sum_power2);
if(msgsnd(msgid,&smsg,100,0)==-1){
printf("msgsnd error!\n");
return;
}
return;
}else{//parent process
wait();
//receive data
msgrcv(msgid,&msg,100,1,0);
printf("square sum:%s\n",msg.mtext);
}
//release resources
msgctl(msgid,IPC_RMID,0);
shmdt(shmaddr);
shmctl(shmid,IPC_RMID,0);
}