1. 程式人生 > >程序間通訊機制(管道、訊號、共享記憶體/訊號量/訊息佇列)、執行緒間通訊機制(互斥鎖、條件變數、posix匿名訊號量)

程序間通訊機制(管道、訊號、共享記憶體/訊號量/訊息佇列)、執行緒間通訊機制(互斥鎖、條件變數、posix匿名訊號量)

(1)系統中每個訊號量的資料結構(sem)
struct sem
{
    int semval; /* 訊號量的當前值 */
    unsigned short  semzcnt;  /* # waiting for zero */
    unsigned short  semncnt;  /* # waiting for increase */
    int sempid; /*在訊號量上最後一次操作的程序識別號*/
};

(2)系統中表示訊號量集合(set)的資料結構(semid_ds)
struct semid_ds
{
    struct ipc_perm sem_perm; /* IPC 許可權 */
    long sem_otime; /* 最後一次對訊號量操作(semop)的時間 */

    long sem_ctime; /* 對這個結構最後一次修改的時間 */
    struct sem *sem_base; /* 在訊號量陣列中指向第一個訊號量的指標 */
    struct sem_queue *sem_pending; /* 待處理的掛起操作*/
    struct sem_queue **sem_pending_last; /* 最後一個掛起操作 */
    struct sem_undo *undo; /* 在這個陣列上的undo 請求 */
    ushort sem_nsems; /* 在訊號量陣列上的訊號量號 */
};

(3)系統中每一訊號量集合的佇列結構(sem_queue)
struct
 sem_queue
{
    struct sem_queue *next;  /* 佇列中下一個節點 */
    struct sem_queue **prev;  /* 佇列中前一個節點, *(q->prev) == q */
    struct wait_queue *sleeper;  /* 正在睡眠的程序 */
    struct sem_undo *undo;  /* undo 結構*/
    int pid; /* 請求程序的程序識別號 */
    int status; /* 操作的完成狀態 */
    struct semid_ds *sma;  /*有操作的訊號量集合陣列 */
    struct
 sembuf *sops;  /* 掛起操作的陣列 */
    int nsops; /* 操作的個數 */
};