标签:IPC 13 操作系统 int semctl sem 盘子 橘子
3、苹果-橘子问题,一个盘子可以放3个水果,爸爸放,儿子和女儿吃,假设儿子和女儿有永远吃不饱。
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<linux/sem.h>
int P(int sem_id)
{
struct sembuf sem_b;
sem_b.sem_num = 0;
sem_b.sem_op = -1;
sem_b.sem_flg = SEM_UNDO;
// 进行p操作
if (semop(sem_id, &sem_b, 1) == -1)
{
fprintf(stderr, "P failed\n");
return 0;
}
return 1;
}
int V(int sem_id) // 释放资源
{
struct sembuf sem_b;
sem_b.sem_num = 0;
sem_b.sem_op = 1;
sem_b.sem_flg = SEM_UNDO;
// 进行v操作
if (semop(sem_id, &sem_b, 1) == -1)
{
fprintf(stderr, "V failed\n");
return 0;
}
return 1;
}
int main()
{
int i = 0;
int pid = 0;
int empty; // 盘子中是否为空
int full; // 盘子中是否为满
int apple; // 苹果有几个
int orange; // 橘子有几个
empty = semget(IPC_PRIVATE, 1, 0666 | IPC_CREAT);
if (semctl(empty, 0, SETVAL, 3) == 1) // 盘子中最多容纳3个水果
{
perror("semctl setval error");
}
full = semget(IPC_PRIVATE, 1, 0666 | IPC_CREAT);
if (semctl(full, 0, SETVAL, 0) == 1) // 盘子现在不满,且0个水果
{
perror("semctl setval error");
}
apple = semget(IPC_PRIVATE, 1, 0666 | IPC_CREAT);
if (semctl(apple, 0, SETVAL, 0) == 1)
{
perror("semctl setval error");
}
orange = semget(IPC_PRIVATE, 1, 0666 | IPC_CREAT);
if (semctl(orange, 0, SETVAL, 0) == 1)
{
perror("semctl setval error");
}
for (i = 0; i < 3; ++i)
{
pid = fork();
if (pid == 0)
{
while (1)
{
if (pid == 0 && i == 0)
{
P(empty);
if (rand() % 2 == 0)
{
printf("爸爸向盘子中放苹果\n");
V(apple);
V(full);
}
else
{
printf("爸爸向盘子中放橘子\n");
V(orange);
V(full);
}
sleep(2);
}
else if (pid == 0 && i == 1)
{
P(full);
P(apple);
printf("儿子从盘子中取走苹果\n");
V(empty);
sleep(2);
}
else if (pid == 0 && i == 2)
{
P(full);
P(orange);
printf("女儿从盘子中取走橘子\n", empty);
V(empty);
sleep(2);
}
}
}
}
return 0;
}
分析:
盘子中最多只能放3个水果,且儿子吃苹果,女儿吃橘子,因此建立四个信号量,两个表示盘中的水果数量空和满,一个表示苹果,一个表示橘子。
父亲先向盘子里放水果,随机选择苹果和橘子,放进去什么什么就多。当有苹果时,儿子就能拿走释放掉苹果和盘子里的水果数量。有橘子时女儿也相同。
标签:IPC,13,操作系统,int,semctl,sem,盘子,橘子 来源: https://blog.csdn.net/qq_43656233/article/details/110495958
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。