进程间通信(IPC)——信息量

一些关于信号量的概念:
临界资源:一次仅允许一个进程使用的资源称临界资源。物理:输入机,打印机,磁带机等。软件有:消息缓冲队列,变量。

P操作(拿锁):如果有可用资源(信号量值>0),则占用一个资源(给信号量值减去一,进入临界区代码);如果没有可用的资源(信号量值等于0),则被堵塞到,直到系统将资源分配给该进程(进入等待队列,一直等到资源轮到该进程)
V操作(放锁):如果在该信号量的等待队列中有进程在等待资源,则唤醒一个阻塞进程。如果没有进程等待它,则释放一个资源(给信号量值加一)

semget(创建或获取一个信号量组):

需要的头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
参数原型:int semget(key_t key, int nsems, int semflg);
key:消息队列的键值,通常通过ftok获取
nsems:需要创建的信号量数目,通常取值为1
semflg:同open()函数的权限位
IPC_CREAT:当semflg&IPC_CREAT为真时,如果内核中不存在键值与key相等的信号量集,则新建一个信号量集;如果存在这样的信号量集,返回此信号量集的标识符
IPC_CREAT|IPC_EXCL:如果内核中不存在键值与key相等的信号量集,则新建一个消息队列;如果存在这样的信号量集则报错
例如: semid = semget(key,1,IPC_CREAT|0666);
返回值:成功返回信号量标识符
失败返回-1

semop(完成对信号的P操作和V操作):

需要的文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
参数原型:int semop(int semid, struct sembuf *sops, unsigned nsops);
semid:semget()函数返回的信号量标识符
sops:指向信号量操作数组,一个数组包括以下成员:
struct sembuf
{
short sem_num; //信号量编号,使用单个信号量时,通常取值为0。
short sem_op; //信号量操作:取值为-1,则表示P操作,取值为+1,则表示V操作
short sem_flg; //通常设置为SEM_UNDO。这样在进程没释放信号量而退出时,系统自动释放该进程中未释放的信号量
}
nsops:操作数组sops中操作个数(元素数目),通常取值为1(一个操作)
例如:
void pGetKey(int id)
{
struct sembuf set;
set.sem_num = 0;
set.sem_op = -1;
set.sem_flg = SEM_UNDO;
semop(id, &set, 1);
printf(“get key\n”);
}

返回值:成功返回信号量集的标识符
失败返回-1

semctl(控制信号量的相关信息):

需要的头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
参数原型:int semctl(int semid, int semnum, int cmd, …);
semid:semget函数返回的信号量标识符
semnum:信号量编号,当时用信号集时才会被用到。通常取值为0,就是使用单个信号量(也是第一个信号量)
cmd:指定对信号量的各种操作,当使用单个信号量(而不是信号量集)时,常用的有以下几种操作:
IPC_STAT:获得该信号量(或者信号量集合)的semid_ds结构,并存放在由第4个参数arg的buf指向的semid_ds结构中。sem_ds是在系统中描述信号量的数据结构。
IPC_SETVAL:将信号量值设置为arg的val值
IPC_GETVAL:返回信号量的当前值
IPC_RMID:从系统中,删除信号量(或信号量集)
arg:是union结构,该结构可能在某些系统中并不给出定义,此时必须由程序员自己定义
union semun {
short val; /SETVAL用的值/
struct semid_ds* buf; /IPC_STAT、IPC_SET用的semid_ds结构/
unsigned short* array; /SETALL、GETALL用的数组值/
struct seminfo *buf; /为控制IPC_INFO提供的缓存/
} arg;
*例如:
union semun
{
int val; /
Value for SETVAL */
struct semid_ds buf; / Buffer for IPC_STAT, IPC_SET /
unsigned short array; / Array for GETALL, SETALL /
struct seminfo __buf; / Buffer for IPC_INFO
};
union semun initsem;
initsem.val = 0;
semctl (semid,0,SETVAL,initsem);

返回值:根据cmd值的不同而返回不同的值
IPC_STAT、IPC_SETVAL、IPC_RMID:返回0
IPC_GETVAL:返回信号量的当前值
出错返回-1。

操作:

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值