• 原理
  • 数据结构和共用体
    • semid_ds
    • sem
    • sembuf
    • semun

    原理

    信号量通信机制主要实现进程间同步,信号量值用来标识系统可用资源的个数。
    实际应用中,两个进程间通信可能会使用多个信号量,因此Linux在管理时以信号量集合的概念来管理。
    通常所说的创建一个信号量实际上是创建了一个信号量的集合。整个信号量集合由以下部分组成:

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

    数据结构和共用体

    semid_ds

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

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

    sem

    每个信号量的数据结构

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

    sembuf

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

    1. struct sembuf{
    2. unsigned short sem_num; /* 信号量标号 */
    3. short sem_op; /* 信号量操作(加减) */
    4. short sem_flg; /* 操作标识 */
    5. };

    semun

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

    1. union semun {
    2. int val; /* SETVAL的值 */
    3. struct semid_ds *buf; /* IPC_STAT, IPC_SET的缓冲 */
    4. unsigned short *array; /* GETALL, SETALL的数组 */
    5. struct seminfo *__buf; /* IPC_INFO的缓冲(Linux-specific) */
    6. };