System V信号量

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)

 

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页