进程间同步——信号量集

一 、创建或者打开信号量
int semget(key_t key,
int nsems,//信号量集中信号量的个数
int flag);//打开:0,创建:IPC_CREAT|0644
返回值:返回信号量集的标识符
查看信号量:
ipcs -s

具体案例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int main(void)
{
        int id=semget(1234,1,IPC_CREAT|0644);
        if(id==-1) perror("semget"),exit(1);
        printf("create ok!\n");

}

二、设置信号量初值

    semctl(   int semid,//信号量集的标识符
                    int semnum,//信号量集中的第几个信号量,信号量集数组的下标
                    int cmd,//SETVAL
                    su);//信号量初值 
    union semun{
            int val;//value of SETVAL
    }


三、查看信号量的值
semctl( int semid,
int semnum,//信号量集中的第几个信号量,信号量集数组的下标
int cmd,//GETVAL
0);
返回值:当前信号量的值


四、PV操作

 semop(int semid,//信号量标识符
                        struct sembuf sb[],//进行操作的信号量的结构体数组
                        int len); //进行操作信号量的个数        

返回值:返回信号量集的标识符
struct sembuf{
short sem_num,//信号量的下标
short sem_op,//1V,-1P
short sem_flag,//0
}
P操作

void p(int id)
{
        struct sembuf sb[1];
        sb[0].sem_num=0;
        sb[0].sem_op=-1;
        sb[0].sem_flg=0;
        semop(id,sb,1);
}
int main(void)
{
        int id=semget(1234,0,0);
        if(id==-1) perror("semget"),exit(1);
        p(id);
}

V操作:

void v(int id)
{
        struct sembuf sb[1];
        sb[0].sem_num=0;
        sb[0].sem_op=1;
        sb[0].sem_flg=0;
        semop(id,sb,1);
}
int main(void)
{
        int id=semget(1234,0,0);
        if(id==-1) perror("semget"),exit(1);
        v(id);
}

操作结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值