使用信号量完成以下程序:
题目:
父亲削苹果,儿子吃苹果;
母亲剥橘子,女儿吃橘子;
苹果、橘子放在同一个盘子中;
盘子容量有限。
**本质上是一个生产者和消费者问题。**
生产者 | 消费者 |
---|---|
父亲 | 儿子 |
母亲 | 女儿 |
需要三个信号量:
0:可用空间数目;
1:苹果数目;
2:橘子数目
终端一:儿子吃苹果(消费者)
//int main()
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<stdio.h>
int main()
{
key_t key;
unsigned short array[3]; //包含0、1、2三个信号量
struct sembuf{
unsigned short sem_num;
short sem_op;
short sem_flg;
}sops[3]; // 3:三个信号量
union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *_buf;
}arg;
int id;
array[0]=5; //可用空间
array[1]=0; //苹果数目
array[2]=0; //橘子数目
key=ftok(".",'a');
id=semget(key,3,IPC_CREAT|0644); // 3:代表一个信号集里有三个信号量
arg.array=array;
semctl(id,0,SETALL,arg); //删除信号量
sops[1].sem_num=1; //对第二个信号量进行操作 (苹果数目)
sops[1].sem_op=-1; //苹果数目-1
sops[1].sem_flg=SEM_UNDO;
sops[0].sem_num=0; //对第一个信号量进行操作 (可用空间数目)
sops[0].sem_op=