信号灯与p v操作集合new


/* sem_com.c */


#include "sem_com.h"


int sem_create(int key,int num)//创建num个信号灯,内部标识为key,key可以由ftok()产生
{
int semid = semget(key, num, IPC_CREAT|IPC_EXCL|0666);
if (semid == -1)
perror("sem_create error");
return semid;
}


int sem_open(int key,int num)//获取信号灯,参数同sem_create()
{
int semid = semget(key, num, 0);
if (semid == -1)
perror("sem_open error");
return semid;
}


int init_sem(int sem_id, int num ,int init_value)//给第num(从0开始)个信号灯赋值init_value,sem_id为sem_create()或者sem_open()返回值
{
union semun sem_union;
sem_union.val = init_value;
if (semctl(sem_id, num, SETVAL, sem_union) == -1)
{
perror("Initialize semaphore");
return -1;
}
return 0;
}


int del_sem(int sem_id)//删除信号灯集合sem_id,sem_id为sem_create()或者sem_open()返回值
{
union semun sem_union;
if (semctl(sem_id, 0, IPC_RMID, sem_union) == -1)
{
perror("Delete semaphore");
return -1; 
}
}


int sem_p(int sem_id,int num)//对信号灯集合中的第num(从0开始)个信号灯P操作
{
struct sembuf sem_b;
sem_b.sem_num = num; /*id*/
sem_b.sem_op = -1; /* P operation*/
sem_b.sem_flg = SEM_UNDO;

if (semop(sem_id, &sem_b, 1) == -1) 
{
perror("P operation");
return -1;
}
return 0;
}


int sem_v(int sem_id,int num)//v操作,参数同p操作
{
struct sembuf sem_b;

sem_b.sem_num = num; /* id */
sem_b.sem_op = 1; /* V operation */
sem_b.sem_flg = SEM_UNDO; 


if (semop(sem_id, &sem_b, 1) == -1)
{
perror("V operation");
return -1;
}
return 0;
}
int sem_getval(int semid,int num)//获取第num个信号灯的值,参数同p操作
{
    int ret = semctl(semid, num, GETVAL, 0);
    if (ret == -1)
        perror("getval:");
    
    return 0;

}





/* sem_com.h */


#ifndef SEM_COM_H
#define SEM_COM_H


#include <sys/ipc.h>
#include <sys/sem.h>


union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
};
int sem_create(int,int);
int sem_open(int,int);
int init_sem(int, int,int);
int sem_getval(int ,int );
int del_sem(int);
int sem_p(int,int);
int sem_v(int,int); 


#endif /* SEM_COM_H */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值