文章摘要:
操作系统: Debian8


创建信号量:

$ ipcmk -S 1 -p 644
Semaphore id: 196609

查看信号量:

$ ipcs -s

------ Semaphore Arrays --------
key        semid      owner      perms      nsems      
0x0c01d24b 196609     user       644        1       

nsems表示信号量数量(非信号数量)

删除信号量:

$ ipcrm -s 196609

函数说明:

#include <sys/sem.h>
#include <sys/ipc.h>
/*
 * 函数原型: int semget(key_t key, int nsems, int oflag) 
 * 参数说明: key   - 键值
 *           nsems - 信号量个数
 *           oflag - 访问权限 
 * 返 回 值: semid
 */
semid = semget(0x1234, 1, IPC_CREAT | 0666);

PV操作

/*
 * 函数原型:int semop(int semid,
 *                    struct sembuf *opsptr, 
 *                    sizt_t nops);
 * 返 回 值:0 - 成功, -1 - Error
 */
struct sembuf semb;
semb.sem_num = 0;        // 信号量编号
semb.sem_op  = 1;        // 正值为V操作/负值为P操作
semb.sem_flg = SEM_UNDO; // {SEM_UNDO,SEM_NOWAIT}
semop(semid, &semb, 1);  // sembuf个数

sem_flg说明:
SEM_UNDO 表示在进程退出时,如果该进程占用其他资源,则操作系统释放该资源
SEM_NOWAIT 表示不阻塞


控制类操作:

/*
 * 函数原型:int semctl(int semid,   // 信号量标识
 *                     int semnum,   // 信号量编号
 *                     int cmd,      // 命令字
 *                     ...);         // 可选参数
 * 返 回 值:与操作相关
 */

设置指定信号量的信号值:

ret = semctl(semid, 0, SETVAL, 1);

获取指定信号量的信号值:

// 返回值表示该信号量的信号值
ret = semctl(semid, 0, GETVAL);

设置所有信号量的信号值:

unsigned short val[10]; 
memset(val, 1, 10);        
ret = semctl(semid, 0, GETALL, val);

获取所有信号量的信号值:

unsigned short val[10];
ret = semctl(semid, 0, GETALL, val);
  1. 信号量编号为0
  2. val数组长度需与nsem相同
  3. 返回值:0 - 成功, 负值 - 失败

删除所有信号:

ret = semctl(semid, 0, IPC_RMID);