头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
三个基本操作函数:
- int semget(key_t key,int num_of_sem,int semflg); //创建一个新的信号量集,或者存取一个已经存在的信号量集
- int semctl(int sem_id,int sem_num,int cmd,union semun arg);
- int semop(int sem_id,struct sembuf*sops,unsign num_of_sops);
int semget(key_t key,int num_of_sem,int semflg)
参数
key:一般是由系统调用ftok()返回,系统内核将此值和系统中存在的其他的信号量集的关键字值进行比较
num_of_semflg:新的信号量集中信号量的个数。信号量集中最多的信号量的个数是在linux/sem.h中定义的
semflg:对信号量集的读写权限和IPC_EXCL或者与IPC_CREAT的或(例如:0666 | IPC_CREAT)
IPC_EXCL+IPC_CREAT:返回新创建的信号量集的标识符,要么调用失败,返回-1。
IPC_CREAT:返回新创建的信号量集的标识符,或者返回系统中已经存在的同样的key值的信号量的标识符。
IPC_EXCL:单独使用没有意义。
返回值:
如果成功,则返回信号量集的IPC标识符。如果失败,则返回-1,并设置errnoerrno值的含义:
- EEXIST(信号量集已经存在,无法创建)
- EIDRM(信号量集已经删除)
- ENOENT(信号量集不存在,同时没有使用IPC_CREAT)
- ENOMEM(没有足够的内存创建新的信号量集)
- ENOSPC(超出限制)
int semctl(int sem_id,int sem_num,int cmd,union semun arg)
参数
sem_id:semget()返回的值
sem_num:信号量集中信号量的编号,从0开始
cmd:可以使用的参数
- IPC_STAT读取一个信号量集的数据结构semid_ds,并将其存储在semun中的buf参数中。
- IPC_SET设置信号量集的数据结构semid_ds中的元素ipc_perm,其值取自semun中的buf参数。
- IPC_RMID将信号量集从内存中删除。
- GETALL用于读取信号量集中的所有信号量的值。
- GETNCNT返回正在等待资源的进程数目。
- GETPID返回最后一个执行semop操作的进程的PID。
- GETVAL返回信号量集中的一个单个的信号量的值。当使用GETVAL命令时,调用中的最后一个参数被忽略
- GETZCNT返回这在等待完全空闲的资源的进程数目。
- SETALL设置信号量集中的所有的信号量的值。
- SETVAL设置信号量集中的一个单独的信号量的值。
union semun{
int val; /*value for SETVAL*/
struct semid_ds* buf; /*buffer for IPC_STAT&IPC_SET*/
ushort* array; /*array for GETALL&SETALL*/
struct seminfo* __buf; /*buffer for IPC_INFO*/
void* __pad;
}
参数
sem_id:semget()返回的值
sops:指向将要操作的数组的指针
/*semop systemcall takes an array of these*/
struct sembuf{
ushort sem_num; /*semaphore index in array*/
short sem_op; /*semaphore operation*/
short sem_flg; /*operation flags*/
}
num_of_sops:数组中的操作的个数