Linux信号量函数

semget

创建信号量结合

函数原型

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);

参数

参数含义,与msgget类似,只是比它多了第二个参数。

  • key为ftok函数创建。
  • nsems为创建的信号量的个数,每个信号量以数组方式存储。
  • semflg用来标识信号量结合的权限。如0700。此外还可以附加以下ipc参数:
宏名描述
IPC_CREAT如果key不存在,则创建*(类似open函数的O_CREAT)*
IPC_EXCL如果key存在,则返回失败*(类似open函数的O_EXCL)*
IPC_NOWAIT如果需要等待,则直接返回错误

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~n-1)
    • 如果标识整个信号量集合,则设置为0【与上面冲突?】
  • cmd为要执行的操作:
    • 共有的IPC四个操作
    • GETVAL //返回的是semnum的值
    • GETALL //设置semnum为0,那么获取信号集合的地址传递给第四个参数。返回值为0,-1
    • GETNCNT //设置semnum为0,返回值为等待信号量值的递增进程数,否则返回-1
    • GETZCNT //设置semnum为0,返回值是等待信号量值的递减进程数,否则返回-1
    • SETVAL //将第四个参数指定的值设置给编号为semnum的信号量。返回值为0,1
    • SETALL //设置semnum为0,将第四个参数传递个所有信号量。返回值0,1

GET的四个操作中,只有GETVAL成功时返回0,其余的都是返相应取的值。SET两个操作都返回的是值

  • [第四个参数],根据cmd的不同而不同。其类型为semun的联合:
    • 如果cmd为SETVAL,那么该参数为val
    • 如果cmd为IPC_STAT&IPC_SET,那么该参数为struct semid_ds结构体变量
    • 如果cmd为GETVAL&SETALL,则该参数为数组地址array。
    • 如果cmd为IPC_INFO,则该参数为strcut seminfo结构体变量__buf

semun

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 (Linux-specific) */
};

semop

该函数的操作对象为信号量,而非信号量集合。这是一个原子操作。

semaphore operate的缩写

函数原型

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semop(int semid, struct sembuf *sops, unsigned nsops);
int semtimedop(int semid, struct sembuf *sops, unsigned nsops,
               struct timespec *timeout);

参数

semid

要操作的信号量集合标识符

sops

此结构体为:

struct sembuf {
    unsigned short  sem_num;    /* 数组中的信号量下标 */
    short        sem_op;        /* 信号量操作 */
    short        sem_flg;    /* 操作标识 */
};

成员解读:

  • sembuf为信号量的编号
  • sem_op是要进行的操作(PV操作):
    • 如果为正整数,表示增加信号量的值(若为3,则加上3)
    • 如果为负整数,表示减小信号量的值
    • 如果为0,表示对信号量当前值进行是否为0的测试
  • sem_flg为操作标识:
    • IPC_NOWAIT:如果不能对信号量集合进行操作,则立即返回
    • SEM_UNDO:当进程退出后,该进程对sem进行的操作将撤销

nsops

操作的信号量的数量

PV

信号量是最早出现的用来解决进程同步与互斥问题的机制。

P原语操作的动作是:

  1. sem减1;
  2. 若sem减1后仍大于或等于零,则进程继续执行;
  3. 若sem减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。

V原语操作的动作是:

  1. sem加1;
  2. 若相加结果大于零,则进程继续执行;
  3. 若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。
  • 30
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值