System V信号量
Linux命令
ipcs -s //查看共享内存
ipcrm -s semid号 //删除共享内存
semget
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/types.h>
int semget(key_t key, int nsems, int semflg); //创建或打开信号量
参数 key:指信号量的key,唯一标识系统中的一个信号量,为非0整数 。
参数 nsems:指定需要的信号量数目,它的值几乎总是1 。
参数 semflg:
如果设置为 IPC_CREAT 标志,即使给出的键是一个已有信号量的键,也不会产生错误,可以用于打开信号量 。
如果设置为 IPC_CREAT | IPC_EXCL 则可以创建一个新的,唯一的信号量,如果信号量已存在,返回一个错误 。
返回值:成功返回semid ,失败返回 -1 。
semop
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/types.h>
int semop(int semid, struct sembuf *sops, unsigned nsops);
参数 semid:待操作的信号量集,即由semget返回的信号量集标识符 。
参数 sops:sembuf结构的指针 。
struct sembuf
{
unsigned short sem_num; //除非使用一组信号,否则为0 ,即操作信号组第几个信号
short sem_op; //两种操作 +1 和 -1
short sem_flg; //一般为0 ,表示阻塞模式
};
参数 nsops:表示同时操作几个信号,一般为1 。
返回值:成功返回0,失败返回-1 。
/* P操作 */
struct sembuf buf = {0, -1, 0};
if (semop(s_semid, &buf, 1) < 0)
{
cout << "sem_p():'p' operation failed !" << endl;
return false;
}
semctl
#include <sys/sem.h>
int semctl(int semid, int semnum, int cmd, .../* union semun arg */);
参数 semid:待操作的信号量集,即由semget返回的信号量集标识符 。
参数 semnum: 标识信号量集中的某一个成员(0、1…知道nsems-1)。
参数 cmd:将对信号量执行的操作 。
参数 arg:(可选),取决于cmd 。
union semun {
int val; /* value for SETVAL */
struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */
unsigned short *array; /* array for GETALL & SETALL */
};
cmd为:GETVAL:把arg中semval的当前值作为函数的返回值返回 。
cmd为:SETVAL:把arg中semval的值设置成arg.val 。
cmd为:IPC_RMID :不选择arg参数,删除信号量
返回值:成功返回非负数 , 失败返回-1 。
/*************设置信号量的value*************/
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
union semun su;
su.val = 1;
semctl(s_semid, 0, SETVAL, su)
/*************获取信号量当前value*************/
int sem_value;
sem_value = semctl(s_semid, 0, GETVAL);
/*************删除信号量集*************/
semctl(s_semid, 0, IPC_RMID)