C语言写出1、父进程创建子进程1 2、父进程从键盘上接受5个数据,对其求和sum1 3、子进程对这5个数求平方和sum2 4、sum2传给父进程,父进程计算 sum1+sum2,并显示结果。说明: 1、数据的传递用大小为10byte的共享内存区实现 2、子进程用消息队列将sum1传给父进程
时间: 2024-04-22 10:28:01 浏览: 112
下面是使用C语言编写的实现父进程创建子进程并完成求和与求平方和的程序,其中使用了共享内存和消息队列实现数据传递:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/msg.h>
#define SHM_SIZE 10
#define MSG_TYPE 1
// 定义消息结构体
struct message {
long mtype;
int sum1;
};
int main() {
int sum1 = 0, sum2 = 0;
int data[5];
// 创建共享内存
key_t shm_key = ftok(".", 's');
int shm_id = shmget(shm_key, SHM_SIZE, IPC_CREAT | 0666);
int* shm_ptr = (int*)shmat(shm_id, NULL, 0);
// 创建消息队列
key_t msg_key = ftok(".", 'm');
int msg_id = msgget(msg_key, IPC_CREAT | 0666);
// 创建子进程
pid_t pid = fork();
if (pid < 0) {
fprintf(stderr, "子进程创建失败\n");
exit(1);
} else if (pid == 0) {
// 子进程计算平方和
printf("子进程正在计算平方和...\n");
for (int i = 0; i < 5; i++) {
sum2 += data[i] * data[i];
}
// 将sum1发送给父进程
struct message msg;
msg.mtype = MSG_TYPE;
msg.sum1 = sum1;
msgsnd(msg_id, &msg, sizeof(struct message) - sizeof(long), 0);
printf("子进程计算完成\n");
exit(sum2);
} else {
// 父进程从键盘接受数据并计算求和
printf("请输入5个整数:\n");
for (int i = 0; i < 5; i++) {
scanf("%d", &data[i]);
sum1 += data[i];
}
// 等待接收子进程发送的消息
struct message msg;
msgrcv(msg_id, &msg, sizeof(struct message) - sizeof(long), MSG_TYPE, 0);
sum2 = WEXITSTATUS(msg.sum1);
// 计算总和并显示结果
int total = sum1 + sum2;
printf("父进程计算结果:sum1 + sum2 = %d\n", total);
// 删除共享内存和消息队列
shmdt(shm_ptr);
shmctl(shm_id, IPC_RMID, NULL);
msgctl(msg_id, IPC_RMID, NULL);
}
return 0;
}
```
在这段代码中,首先通过`shmget()`函数创建了一个大小为10字节的共享内存区域,并通过`shmat()`函数将共享内存连接到当前进程的地址空间。然后,通过`msgget()`函数创建了一个消息队列。
在子进程中,计算平方和后,使用`msgsnd()`函数将sum1发送给父进程。
在父进程中,从键盘接收数据并计算求和后,使用`msgrcv()`函数等待接收子进程发送的消息,并将sum1的值赋给sum2。最后,计算总和并显示结果。
在程序结束时,使用`shmdt()`函数将共享内存与当前进程分离,并使用`shmctl()`函数和`msgctl()`函数删除共享内存和消息队列。
请注意,由于共享内存和消息队列的使用需要对IPC资源进行清理,因此在程序结束时需要调用相应的函数进行资源的释放和删除。
阅读全文