Linux 学习日记(6) 信号量

这篇博客通过一个家庭场景,介绍了如何使用三个信号量来管理苹果和橘子的分配问题,确保盘子容量和水果数量的同步。信号量分别表示可用空间、苹果数和橘子数。
摘要由CSDN通过智能技术生成
                                  使用信号量完成以下程序:

题目:
父亲削苹果,儿子吃苹果;
母亲剥橘子,女儿吃橘子;
苹果、橘子放在同一个盘子中;
盘子容量有限。

                                **本质上是一个生产者和消费者问题。**
生产者 消费者
父亲 儿子
母亲 女儿

需要三个信号量:
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=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值