LinuxIPC信号量

信号量

1
2
3
4
5
6
#include<sys/sem.h>
#include<sys/ipc.h>
#include<sys/types.h>
int semget(key_t key,int nsems,int flags);
int semop(int semid,struct sembuf *sops,size_t num_sops);
int semctl(int semid,int semnum,int cmd,...);
  • 函数semget创建一个信号集或访问一个已存在的信号集。返回值:成功时返回信号量标识符的整数,出错时返回-1
  • 参数key时唯一标识一个信号量的关键字,如果为IPC_PRIVATE(值为0,私有)表示创建一个可以被多个进程共享的信号量
  • 参数nsems指定需要使用的信号量的数目。如果是创建新集合,必须指定nsems,如果引用一个现存的集合,则指定为0
  • 参数flag是一组标志,其作用与open函数的标志很相似,它低端九位是该操作量的权限
  • 函数semop用于改变信号量对象中各个信号量的状态。返回值:成功时返回0;失败时返回-1
    1
    2
    3
    4
    5
    struct sembuf{
    short sem_num;//编号,从0开始
    short sem_op;//信号量,-1:p操作,+1:v操作
    short sem_flg; //通常设为:SEM_UNDO,程序结束,信号量为semop调用前的值
    };
    参数cmd为执行的操作,通常为 | 参数 | 说明 | | -------- | ------------------------------------------------------------ | | IPC_RMID | 立即删除信号集,唤醒所有被阻塞进程 | | GETVAL | 根据semun返回信号量的值,从0开始,第一个信号编号为0 | | SETVAL | 根据semun设定信号的值,从0开始,将所有的信号存入semun.array中 | | SETALL | 将所有semun.array的值设定到信号集中,第二个参数为0 | 参数...是一个union semun(需要自己定义),至少包含以下成员
    1
    2
    3
    4
    5
    6
    union semun{
    int val;
    struct semid_da *buf;
    unsigned short *array;
    };
    //通常情况只用val,给val赋值1
    删除命令是ipcrm [-m|-s|-q] id

-m 删除共享内存,-s删除共享信号量,-q删除共享队列。

ipcrm -m shmid

ipcrm -s semid

ipcrm -q msqid