进程间通信-信号量集

通用代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

union _semun{
  int val;
};

int main(){
    // 1.创建(打开)信号量集 
    int semid = semget(1234, 1, IPC_CREAT|0644);  
    if(semid < 0){
      perror("semget");
        return 1;
    }

    // 2.初始化信号量集
    union _semun semun;
    semun.val = 1;
    semctl( semid, 0, SETVAL, semun );

    // 3.P()
    struct sembuf buf_p;
    buf_p.sem_num = 0;
    buf_p.sem_flg = 0;
    buf_p.sem_op = -1;
    semop(semid , &buf_p, 1);

    // 4.操作

    // 5.V()
    struct sembuf buf_v;
    buf_v.sem_num = 0;
    buf_v.sem_flg = 0;
    buf_v.sem_op  = 1;
    semop(semid , &buf_v, 1);

    // 6.删除信号集
    if ( semctl(semid, 0, IPC_RMID) < 0  ){
        perror("semctl");                                              
     return 1;
    } 

    return 0;
}

API

创建: int semget(key_t key, int nsems, int semflg);

key: 唯一值    

nsems: 信号量的个数,一般为1,打开为0    

semflg:操作 IPC_CREAT|0644,打开为0

初始化:int semctl(int semid, int semnum, int cmd, …);

需要自己自构建结构体

    union _semun{ int val; };

semnum: 想要初始化第几个信号量:0为第1个,1为第2个

cmd: 初始化的操作码是:SETVAL

...:  填入联合体semun

PV操作: int semop(int semid, struct sembuf *sops, unsigned nsops);

1.声明一个结构体 sembuf 

2.给sembuf进行赋值,sem_num表示那个信号量,sem_op表示什么操作,sem_flg 为0

3.nsops表示对几个信号量进行操作。

卸载:int semctl(int semid, int semnum, int cmd, …);

semnum : 0

cmd : IPC_RMID

猜你喜欢

转载自blog.csdn.net/xiaozuo666/article/details/80800404