进程间通信——信号灯集

1.特点

信号灯(semaphore),也叫信号量。它是不同进程间或一个给定进程内部不同线程间同步的机制;System V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。而Posix信号灯指的是单个计数信号灯。

通过信号灯集实现共享内存的同步操作

2.步骤

1)创建key值

 key_t key;
    
 //创建key值
 if ((key = ftok("./app", 'a')) < 0)
  {
       perror("ftok err");
       return -1;
  }

2) 创建或打开信号灯集:semget

 int semid;
//创建信号灯集
    semid = semget(key, 2, IPC_CREAT | IPC_EXCL | 0666); //2为信号灯数量,
    if (semid < 0)
    {
        if (errno == EEXIST)
            semid = semget(key, 2, 0666); //若存在,直接打开,2为信号灯数量
        else
        {
            perror("semget err");
            return -1;
        }
    }

3) 初始化信号灯:semctl

//初始化
         union semun sem;
         sem.val = 10;
         semctl(semid, 0, SETVAL, sem); //给第一个灯赋初值为10
         sem.val = 0;
         semctl(semid, 1, SETVAL, sem); //给第二个灯赋初值为0

4) PV操作:semop

//pv操作函数
void sem_pv(int semid, int num, int op, int flg)
{
    struct sembuf buf;
    buf.sem_num = num;
    buf.sem_op = op;
    buf.sem_flg = flg;
    semop(semid, &buf, 1);
}
//执行pv操作时,直接调用此函数即可

5) 删除信号灯集:semctl

//删除信号灯集
    semctl(semid, 0, IPC_RMID); //可以删除任意一个编号的信号灯,即可全部删除

3.补充

ipcs -s:查看信号灯集

ipcrm -s semid:删除信号灯集

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值