1.头文件
#include <sys / types.h>
#include <sys / ipc.h>
#include <sys / sem.h>
函数
int semop(int semid ,struct sembuf * sops ,size_t nsops );
功能:用户改变信号量的值。也就是使用资源还是释放资源使用权。
**semid ** :信号量的标识码。也就是semget()的返回值。
sops: 是一个指向结构体数组的指针。
struct sembuf{
unsigned short sem_num;//第几个信号量,第一个信号量为0;
short sem_op;//对该信号量的操作.
short _semflg;
};
sem_op = -1,进行p操作 , 即对信号量进行减一操作;
sen_op = 1; 进行V 操作,即释放资源.
_semflg :IPC_NOWAIT //对信号的操作不能满足时,semop()不会阻塞,并立即返回,同时设定
错误信息。
IPC_UNDO //程序结束时(不论正常或不正常),保证信号值会被重设为semop()调用前的值。这样
做的目的在于避免程序在异常情况下结束时未将锁定的资源解锁,造成该资源永远锁定。
sem_num: 操作信号在信号集中的编号。第一个信号的编号为0
返回值:
成功返回0,失败返回-1;
例子
#include "head.h"
int sem_id, um_num, stu_num;
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *_buff;
};
static int init_semval(int val) {
union semun sem_set;
sem_set.val = val;
if (semctl(sem_id, 0, SETVAL, sem_set) == - 1) {
perror("semctl");
return 0;
}
return 1;
}
static int del_semval() {
union semun sem_del;
if (semctl(sem_id, 0, IPC_RMID, sem_del) == <