linux下信号量编程

头文件:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

三个基本操作函数:

  1. int semget(key_t key,int num_of_sem,int semflg);   //创建一个新的信号量集,或者存取一个已经存在的信号量集
  2. int semctl(int sem_id,int sem_num,int cmd,union semun arg);
  3. 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值的含义:

  1. EEXIST(信号量集已经存在,无法创建)
  2. EIDRM(信号量集已经删除)
  3. ENOENT(信号量集不存在,同时没有使用IPC_CREAT)
  4. ENOMEM(没有足够的内存创建新的信号量集)
  5. ENOSPC(超出限制)

int semctl(int sem_id,int sem_num,int cmd,union semun arg)

参数
sem_id:semget()返回的值
sem_num:信号量集中信号量的编号,从0开始
cmd:可以使用的参数

  1. IPC_STAT读取一个信号量集的数据结构semid_ds,并将其存储在semun中的buf参数中。
  2. IPC_SET设置信号量集的数据结构semid_ds中的元素ipc_perm,其值取自semun中的buf参数。
  3. IPC_RMID将信号量集从内存中删除。
  4. GETALL用于读取信号量集中的所有信号量的值。
  5. GETNCNT返回正在等待资源的进程数目。
  6. GETPID返回最后一个执行semop操作的进程的PID。
  7. GETVAL返回信号量集中的一个单个的信号量的值。当使用GETVAL命令时,调用中的最后一个参数被忽略
  8. GETZCNT返回这在等待完全空闲的资源的进程数目。
  9. SETALL设置信号量集中的所有的信号量的值。
  10. SETVAL设置信号量集中的一个单独的信号量的值。
sem_union_arg:代表一个semun的实例,是在linux/sem.h中定义的
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; 
} 


int semop(int sem_id,struct sembuf* sops,unsign num_of_sops)

参数

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:数组中的操作的个数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值