曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6332|回复: 0
打印 上一主题 下一主题

[进程] semctl | 信号集的控制

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2009-9-4 23:41:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用信号量时,往往需要对信号集进行一些控制操作,比如删除信号集,对内核维护的信号集的数据结构 semid_ds 进行设置、获取信号集中信号值等。通过 semctl() 函数可以完成这些操作,该函数定义在 sys/sem.h 中,如下所示:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int semctl(int semid, int semnum, int cmd, ...);

参数 semid 为信号集的标识符;

参数 semnum 标识一个特定的信号;

参数 cmd  指明控制操作的类型;

"...."  说明函数的参数是可选的,它依赖于第三个参数 cmd ,它通过共用体变量 semun 选择要操作的参数。

semnun 定义如下:
/* arg for semctl system calls. */
union semun {
        int val;                        /* value for SETVAL */
        struct semid_ds *buf;   /* buffer for IPC_STAT & IPC_SET */
        unsigned short *array/* array for GETALL & SETALL */
        struct seminfo *__buf/* buffer for IPC_INFO */
        void *__pad;
};
各字段含义如下:
      val : 用于 SETVAL 操作类型,设置某个信号的值等于 val 。
      buf : 用于 IPC_STAT 和  IPC_SET 操作,存取 semid_ds 结构。
      array : 用于 SETALL 和 GETALL 操作。
      __buf : 为控制 IPC_INFO 提供的缓存。
参数 cmd ,通过宏来指示操作类型,可取的各个宏含义如下:
      IPC_STAT : 通过 semun 结构体的 buf 参数返回当前的 semid_ds 结构体。注意,调用前必须首先分配一个 semid_ds 结构,并把 buf 设置为指向这个结构体。
      IPC_SET : 对信号集的属性进行设置。
      IPC_RMID : 把 semid 指定的信号集从系统中删除。
      GETPID : 返回最后一个执行 semop 操作的进程 ID 。
      GETVAL  : 返回信号集中 semnum 指定信号的值。
      GETALL  : 返回信号集中所有信号的值。
      GETNCNT : 返回正在等待资源的进程的数量。
      GETZCNT : 返回正在等待完全空闲资源的进程数量。
      SETVAL : 设置信号集中 semnum 指定的信号的值。
      SETALL : 设置信号集中所有信号的值。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-6 10:04 , Processed in 0.075415 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表