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; /* semaphore number */
short sem_op; /* semaphore operation*/
short sem_flg; /* operation flags */
};
semop:
- semid:信号量集id
- sops:指向信号量操作的数组
- nsops:sops指向数组的大小
- 返回值:
0 成功
-1 失败
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)
- 返回值:
失败: -1
成功: 与cmd相关
union semun {
//在目前的sem.h中该共用体被注释了
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) */
};
struct semid_ds {
struct ipc_perm sem_perm; /* Ownership and permissions */
time_t sem_otime; /* Last semop time */
time_t sem_ctime; /* Last change time */
unsigned long sem_nsems; /* No. of semaphores in set */
};
struct ipc_perm {
key_t __key; /* Key supplied to semget(2) */
uid_t uid; /* Effective UID of owner */
gid_t gid; /* Effective GID of owner */
uid_t cuid; /* Effective UID of creator */
gid_t cgid; /* Effective GID of creator */
unsigned short mode; /* Permissions */
unsigned short __seq; /* Sequence number */
};
struct seminfo {
int semmap; /* Number of entries in semaphore map; unused within kernel */
int semmni; /* Maximum number of semaphore sets */
int semmns; /* Maximum number of semaphores in all semaphore sets */
int semmnu; /* System-wide maximum number of undo structures; unused within kernel */
int semmsl; /* Maximum number of semaphores in a set */
int semopm; /* Maximum number of operations for semop(2) */
int semume; /* Maximum number of undo entries per process; unused within kernel */
int semusz; /* Size of struct sem_undo */
int semvmx; /* Maximum semaphore value */
int semaem; /* Max. value that can be recorded for semaphore adjustment (SEM_UNDO) */
};
只是简单介绍了信号量的相关api,目前还没找到一个相对好的测试代码
参考: man手册、mooc