Linux信号量概念

信号量

原理

信号量通信机制主要实现进程间同步,信号量值用来标识系统可用资源的个数。

实际应用中,两个进程间通信可能会使用多个信号量,因此Linux在管理时以信号量集合的概念来管理。

通常所说的创建一个信号量实际上是创建了一个信号量的集合。整个信号量集合由以下部分组成:

  • 信号量集合数据结构:在此结构中定义了整个信号量集合的基本属性,如访问权限。
  • 信号量:信号量集合使用指针指向一个由数组组成的信号量单元,在此信号量单元中存储了创建时申请的信号量。

数据结构和共用体

semid_ds

信号量集合数据结构。一般不直接调用,而是作为[[semctl()|semctl]]的第四个参数semun的成员出现。

/*位于/usr/include/linux*/
struct semid_ds {
    struct ipc_perm    sem_perm;        /* 权限 .. see ipc.h */
    __kernel_time_t    sem_otime;        /* 最近semop时间 */
    __kernel_time_t    sem_ctime;        /*最近 修改时间*/
    struct sem    *sem_base;        /* 队列第一个信号量 */
    struct sem_queue *sem_pending;        /* 阻塞信号量 */
    struct sem_queue **sem_pending_last;    /* 最后一个阻塞信号量*/
    struct sem_undo    *undo;    /* undo队列 */
    unsigned short    sem_nsems; /* no. of semaphores in array */
};

sem

每个信号量的数据结构

/*位置不明。。*/
struct sem{
       int semval; /*信号量的值*/
       int sempid; /*最近一个操作的进程号PID*/
};

sembuf

被[[semop()|semop]]用到

struct sembuf{
        unsigned short sem_num;  /* 信号量标号 */
        short          sem_op;   /* 信号量操作(加减) */
        short          sem_flg;  /* 操作标识 */
};

semun

这个是个union类型。注意它包含了几个不同类型的成员,具体用到哪个依据[[semctl()|semctl]]第三个参数的不同而不同。

union semun {
        int              val;    /* SETVAL的值 */
        struct semid_ds *buf;    /* IPC_STAT, IPC_SET的缓冲 */
        unsigned short  *array;  /* GETALL, SETALL的数组 */
        struct seminfo  *__buf;  /* IPC_INFO的缓冲(Linux-specific) */
};
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值