semop-System V信号量操作

本文介绍了System V信号量操作中的semop函数,包括所需的头文件、参数解析和使用示例。semop用于对信号量进行P(减一)和V(释放资源)操作,通过设置不同的参数实现不同行为,如IPC_NOWAIT和IPC_UNDO选项来控制阻塞和资源恢复。
摘要由CSDN通过智能技术生成

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;

例子

semctl()

semget()

#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) == <
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值