其他分享
首页 > 其他分享> > 信号量

信号量

作者:互联网

#include <iostream>                                                                                          
#include <sys/types.h>
#include <sys/sem.h>
#include <unistd.h>

// 联合体 用于semctl初始化
union semun {
    int val; //for SETVAL
    struct semid_ds *buf;
    unsigned short *array;
};
// 初始化信号量
int init_sem(int sem_id,int value)
{
    union semun tmp;
    tmp.val = value;
    if(semctl(sem_id,0,SETVAL,tmp) == -1)
    {   
        perror("Init Semaphore Error");
        return -1;
    }
    return 0;
}

// P操作
int sem_p(int sem_id)
{
    struct sembuf sbuf;
    sbuf.sem_num = 0; // 序号
    sbuf.sem_op = -1; // P操作
    sbuf.sem_flg = SEM_UNDO;

    if(semop(sem_id,&sbuf,1) == -1)
    {   
        perror("P operation Error");
        return -1;
    }
    return 0;
}
// V操作
int sem_v(int sem_id)
{
    struct sembuf sbuf;
    sbuf.sem_num = 0;
    sbuf.sem_op = 1;
    sbuf.sem_flg = SEM_UNDO;

    if(semop(sem_id,&sbuf,1) == -1)
    {
        perror("V operation Error");
        return -1;
    }
    return 0;
}
// 删除信号量集
int del_sem(int sem_id)
{
    union semun tmp;
    if(semctl(sem_id,0,IPC_RMID,tmp) == -1)
    {
        perror("Delete Semaphore Error");
        return -1;
    }
    return 0;
}

int main()
{
    int sem_id; // 信号量集ID
    key_t key;
    pid_t pid;
    // 获取key值
    if((key = ftok(".",'z')) < 0)
    {
        perror("ftok error");
        exit(1);
    }
    // 创建信号量集,其中只有一个信号量
    if((sem_id = semget(key,1,IPC_CREAT|0666)) == -1)
    {
        perror("semget error");
        exit(1);
    }
    // 初始化: 初值设为0资源被占用
    init_sem(sem_id,0);

    if((pid=fork()) < 0)
    {
        perror("fork");
    }else if(pid == 0)
    {
        sleep(2);
        printf("Process child: pid=%d\n",getpid());  
        sem_v(sem_id);
        del_sem(sem_id);
        // 父进程
    }
    return 0;

标签:return,int,sbuf,信号量,perror,sem,id
来源: https://www.cnblogs.com/lodger47/p/15019747.html