linux中的semop和semctl函数

semop

https://man7.org/linux/man-pages/man2/semop.2.html

函数简介:

  • 名称: semop, semtimedop - System V semaphore operations
  • 所在库:Standard C library (libc, -lc)
  • 形式:
    #include <sys/sem.h>
    int semop(int semid, struct sembuf *sops, size_t nsops);
    
    每个在信号量集中的信号都有如下属性
    理解信号量集(semaphore set):可以理解为一个semaphore 数组,而其中的每个semaphore都是一个结构如下的结构体:
    struct semaphore{
         
    unsigned short  semval;   /* semaphore value 信号值 */
    unsigned short  semzcnt;  /* # 等待零 */
    unsigned short  semncnt;  /* # 等待增加 */
    pid_t           sempid;   /* 上次修改信号量值的进程的 PID */
    }
    

函数参数:

  • struct sembuf *sops
    对 semid 指示的集合中的选定信号量执行操作。 参数struct sembuf *sops 指向的数组中的每个元素都是一个结构体,用于指定要在单个信号量上执行的操作。
    理解“操作是一个结构体”:在以前,操作可能就由一个字符或者一个参数就能表达,例如数值运算的+-*/,或者IPC_CREAT参数,但是在这里,对于每个信号量进行的操作需要一个结构体的所有属性(三个)共同指定、共同完成。
    struct sembuf{
         
    unsigned short sem_num;  /* semaphore number */
    short          sem_op;   /* semaphore operation */
    short          sem_flg;  /* operation fla
在Unix/Linux系统中,`semget()`、`semctl()``semop()`是一组系统调用,它们用于操作共享内存区域中的信号量(Semaphore)。信号量是一种同步机制,它允许进程之间协调资源访问任务执行顺序。 1. **semget()** 函数:这是一个用于获取信号量集合(Semaphore Set)的函数,参数包括一个标识符(key)、一个信号量集大小(nsems)权限(semflg)。它会在共享内存中创建或打开一个信号量集,并返回一个对应的标识符,后续操作可以使用这个标识符来引用特定的信号量。 ```c key_t sem_id = semget(key, nsems, semflg); ``` 2. **semctl()** 函数:这个函数用于控制已存在的信号量,比如获取或设置信号量值,改变信号量属性等。它需要传入信号量集的标识符、信号量索引(通常从0开始)操作命令(如SEM_GETVALUE获取值,SEM_SETVALUE设置值等)。 ```c union semun arg; // 定义操作参数 arg.val = new_value; // 设置新值 semctl(sem_id, index, SEM_SETVALUE, arg); ``` 3. **semop()** 函数:这是核心的信号量操作函数,接收一个结构体数组(包含操作指令的描述符,如SemaDesc),每个描述符包含了信号量的操作类型(如P(取)、V(给))信号量索引。这个函数会按照描述符的顺序执行相应的操作。 ```c struct sembuf op[] = { {sem_id, 0, 1}, // 信号量ID, 指令,操作数(取) {0, 0, 0} // 结束标记,无效操作操作数 }; semop(sem_id, op, sizeof(op)/sizeof(op[0])); ``` 使用这些函数,你可以实现复杂的并发控制,例如生产者消费者模型、互斥锁等。需要注意的是,信号量的使用应该遵守互斥规则,防止数据竞争。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值