【linux】信号量

信号量:
互斥: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);
}

猜你喜欢

转载自blog.csdn.net/dachunfree/article/details/77870137