用c语言模仿实现“吃水果”问题并展示完整代码 要求如下1.实现多进程的创建、进程间同步与互斥解决具体问题。 2.问题描述:桌上有一盘子,桌上有一个空盘,允许存放一只水果,爸爸可向盘内放苹果,妈妈可向盘内放桔子,儿子专等吃盘内的桔子,女儿专等吃盘中的苹果。 桌上有一盘子,桌上有一个空盘,允许存放一只水果,爸爸可向盘内放苹果,妈妈可向盘内放桔子,儿子专等吃盘内的桔子,女儿专等吃盘中的苹果。
时间: 2023-11-26 22:05:11 浏览: 134
下面是用C语言模仿实现“吃水果”问题并展示完整代码,其中使用了多进程的创建、进程间同步与互斥来解决具体问题:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#define KEY 1234 // 信号量键值
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};
int semid; // 信号量ID
void P(int semid, int index) { // P操作
struct sembuf sem;
sem.sem_num = index;
sem.sem_op = -1;
sem.sem_flg = 0;
semop(semid, &sem, 1);
}
void V(int semid, int index) { // V操作
struct sembuf sem;
sem.sem_num = index;
sem.sem_op = 1;
sem.sem_flg = 0;
semop(semid, &sem, 1);
}
void father() {
while (1) {
sleep(rand() % 5 + 1); // 随机睡眠1-5秒
P(semid, 0); // 等待爸爸能放水果的标志被设置
printf("爸爸放了一个苹果\n");
V(semid, 1); // 设置妈妈能放水果的标志
P(semid, 2); // 清除爸爸能放水果的标志
}
}
void mother() {
while (1) {
sleep(rand() % 5 + 1); // 随机睡眠1-5秒
P(semid, 1); // 等待妈妈能放水果的标志被设置
printf("妈妈放了一个桔子\n");
V(semid, 2); // 设置儿子能吃水果的标志
P(semid, 3); // 清除妈妈能放水果的标志
}
}
void son() {
while (1) {
sleep(rand() % 5 + 1); // 随机睡眠1-5秒
P(semid, 2); // 等待儿子能吃水果的标志被设置
printf("儿子吃了一个桔子\n");
V(semid, 3); // 设置女儿能吃水果的标志
P(semid, 0); // 清除儿子能吃水果的标志
}
}
void daughter() {
while (1) {
sleep(rand() % 5 + 1); // 随机睡眠1-5秒
P(semid, 3); // 等待女儿能吃水果的标志被设置
printf("女儿吃了一个苹果\n");
V(semid, 0); // 设置爸爸能放水果的标志
P(semid, 1); // 清除女儿能吃水果的标志
}
}
int main() {
int i;
// 创建四个进程
pid_t pid[4];
for (i = 0; i < 4; i++) {
pid[i] = fork();
if (pid[i] == 0) {
srand(getpid()); // 为了让每个子进程的随机数不同,故使用getpid()作为seed
break;
}
}
if (i == 4) { // 父进程
union semun arg;
arg.val = 1; // 爸爸能放水果的标志
semid = semget(KEY, 4, IPC_CREAT | 0666);
semctl(semid, 0, SETVAL, arg); // 设置爸爸能放水果的标志
arg.val = 0; // 妈妈能放水果的标志
semctl(semid, 1, SETVAL, arg);
arg.val = 0; // 儿子能吃水果的标志
semctl(semid, 2, SETVAL, arg);
arg.val = 0; // 女儿能吃水果的标志
semctl(semid, 3, SETVAL, arg);
// 等待子进程结束
for (i = 0; i < 4; i++) {
waitpid(pid[i], NULL, 0);
}
} else if (i == 0) { // 爸爸进程
father();
} else if (i == 1) { // 妈妈进程
mother();
} else if (i == 2) { // 儿子进程
son();
} else { // 女儿进程
daughter();
}
return 0;
}
```
运行上述代码后,程序会模拟爸爸、妈妈、儿子和女儿四个进程进行“吃水果”的操作。在这个过程中,爸爸和妈妈可以向盘子中放入水果,儿子和女儿则只能吃盘子中对应的水果。程序使用了多进程和信号量等技术来保证进程间的同步和互斥。
阅读全文