目录
- 1、相关函数
- 1.1、创建或引用信号量集: semget()
- 1.2、对信号量的操作:semop()
- 1.3、对信号量集的操作:semctl()
1、相关函数
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
1.1、创建或引用信号量集: semget()
int semget(key_t key, int nsems, int semflg);
- key:创建信号量的键值
可通过ftok产生,也可自定义
0 或 IPC_PRIVATE :只能创建信号集,并且通过此值创建的信号集键值都为0
非0:创建信号集 或 引用key对应的信号集 - nsems:信号集中信号量的 个数
创建时必须指明nsems
引用时可以为0,表示不关心;或者大于0小于等于被引用的最大信号量数 - semflg:信号集的权限
IPC_CREAT:创建时使用,若key对应的信号集存在,则返回对应的semid
IPC_EXCL:和IPC_CREAT搭配,若key对应的信号集存在则会报错
0666;和IPC_CREAT搭配,指定信号集的权限
0:单独使用,只能用来获取key对应的semid
- 返回值:
> 0 信号量集的id(semid)
-1 失败
创建信号量集时会初始化semid_ds结构体
1.2、对信号量的操作:semop()
int semop(int semid, struct sembuf *sops, size_t nsops);
struct sembuf{
unsigned short sem_num;
short sem_op;
short sem_flg;
};
semop:
- semid:信号量集id
- sops:指向信号量操作的数组
- nsops:sops指向数组的大小
sembuf:
- sem_num:要操作的信号量的编号(从0开始)
- sem_flg:以怎样的方式操作信号量
IPC_NOWAIT:不阻塞调用进程
SEM_UNDO:在进程结束时取消响应的操作(这里不是很理解) - sem_op;对信号量的操作
1.3、对信号量集的操作:semctl()
int semctl(int semid, int semnum, int cmd,...);
- semid:信号量集id
- semnum:要操作的信号量的编号
- cmd:要执行的操作
- …:设置或返回信号量信息(以前的版本是union semun arg)
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
struct semid_ds {
struct ipc_perm sem_perm;
time_t sem_otime;
time_t sem_ctime;
unsigned long sem_nsems;
};
struct ipc_perm {
key_t __key;
uid_t uid;
gid_t gid;
uid_t cuid;
gid_t cgid;
unsigned short mode;
unsigned short __seq;
};
struct seminfo {
int semmap;
int semmni;
int semmns;
int semmnu;
int semmsl;
int semopm;
int semume;
int semusz;
int semvmx;
int semaem;
};
只是简单介绍了信号量的相关api,目前还没找到一个相对好的测试代码
参考: man手册、mooc
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)