【linux】信号量

来源:互联网 发布:新浪微盾网络异常 编辑:程序博客网 时间:2024/06/10 22:52

信号量:
互斥:P、V在同一个进程中。
进程A当进行P操作,信号量资源数减1,比如信号量资源个数设置为1,p操作后就会变0. 进程B再进行P操作,信号量资源数变为-1,开始阻塞该进程。进程A进行V操作,释放信号量资源+1,信号量资源数变为0.开始唤醒B进程。B进程执行结束后,执行V操作,释放信号量资源,此时会变为1.

#include "sem.h"int sem_creat(int key){    int semid;    semid = semget(key,1,0666|IPC_CREAT);// 1表示信号量的个数    return semid;}int sem_open(int key){    int semid;    semid = semget(key,1,0666);    return semid;}int sem_set(int semid,int semnu){    union semun set_1;    int ret;    set_1.val = semnu;  // 表示信号量的下标,即你开辟了这么多个信号量,你要用哪个呢?    ret = semctl(semid,0,SETVAL,set_1);     return ret;}int sem_get(int semid){    union semun set_1;    int ret;    ret = semctl(semid,0,GETVAL,set_1);     return set_1.val;}int set_p(int semid){    struct sembuf sops = {0,-1,0};// p 操作表示可用资源数减1    int ret = semop(semid,&sops,1);    return ret;}int set_v(int semid){    struct sembuf sops = {0,1,0};    int ret = semop(semid,&sops,1);// v 操作表示可用资源数加1    return ret;}int main(){    int semid = sem_creat(0x1233);    int ret = sem_set(semid,1);    if(ret == -1)    {        printf("set value is error.....\n");    }    ret = sem_get(semid);    if(ret != -1)    printf("get value is %d \n",ret);    pid_t pid = fork();    set_p(semid);//    sleep(3);    printf("pid is %d \n\n",getpid());    set_v(semid);}