当前位置:网站首页>unix环境编程 第十五章 15.8信号量

unix环境编程 第十五章 15.8信号量

2022-08-09 10:26:00 玛丽苏打肉饼

信号量与IPC不同,它是一个计数器,用于为多个进程提供对共享数据对象的访问。

为了获得共享资源,进程需要执行下列操作:

  1. 测试控制该资源的信号量。
  2. 若此信号量的值为正,则进程可以使用该资源,在这种情况下,进程会将信号量值减1,表示它使用了一个资源单位。
  3. 若此信号量的值为0,则进程进入休眠状态,直至信号量值大于0.

当进程不在使用由一个信号量控制的共享资源时,该信号量值增1。如果有进程正在休眠等待此信号量,则唤醒他们。信号量值的增减操作时原子操作。

常用的信号量形式被称为二元信号量,它控制单个资源,其初始值为1。

当我们想使用XSI信号量时,首先需要通过调用函数semget来获得一个信号量ID。

#include <sys/sem.h>
int semget(key_t key,int nsems,int flag);
//成功返回信号量ID,出错返回-1

nsems是该集合中的信号量数,如果是创建新集合,则必须指定nsems。如果是引用现有集合(一个客户进程),则将nsems指定为0。

smectl函数包含了多种信号量操作

#include <sys/sem.h>
int semctl(int semid,int semnum,int cmd,...)

第四个参数是可选的,它是否使用取决于所请求的命令,如果使用该参数,则其类型是senum,它是多个命令特定参数的联合:

union semun
{
  int val; /*for SETVAL*/
  struct semid_ds *buf; /*for IPC_STAT and IPC_SET*/
  unsigned short *array;/*for GETALL and SETALL*/
}

函数semop自动执行信号量集合上的操作数据

#include <sys/sem.h>
int semop(int semid,struct sembuf semoparray[],size_t nops);
//成功返回0,出错返回-1

参数semoparray是一个指针,它指向一个由sembuf结构表示的信号量操作数组:

struct sembuf
{
  unsigned short sem_num;
  short sem_op;
  short sem_flg;
}

参数nops规定该数组中操作的数量。

原网站

版权声明
本文为[玛丽苏打肉饼]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_43873960/article/details/121662351