Linux處理序間通訊(System V) --- 訊號量

來源:互聯網
上載者:User

Linux處理序間通訊(System V) --- 訊號量
訊號量 IPC 原理

訊號量通訊機制主要用來實現進程間同步,避免並發訪問共用資源。訊號量可以標識系統可用資源的個數。最簡單的訊號量為二元訊號量

為 Linux 訊號量通訊機制的概念圖。在實際應用中,兩個進程通訊可能會使用多個訊號量,因此,Linux 在管理時以訊號量集合的概念來管理。

通常所說的建立一個訊號量實際上是建立了一個訊號量集合,在這個訊號量集合中,可能有多個訊號量。整個訊號量集合由以下部分組成。

1.訊號量集合資料結構:在此資料結構中定義了整個訊號量集合的基本屬性,如存取權限。2.訊號量:訊號量集合使用指標指向一個由數組構成的訊號量單元,在此訊號量單元中儲存了各訊號量的值。

訊號量集合的資料結構定義如下:

from /usr/include/linux/sem.hstruct semid_ds {    struct ipc_perm sem_perm;       /* permissions .. see ipc.h 許可權 */    __kernel_time_t sem_otime;      /* last semop time 最近semop時間 */    __kernel_time_t sem_ctime;      /* last change time 最近修改時間 */    struct sem  *sem_base;          /* ptr to first semaphore in array 第一個訊號量 */    struct sem_queue *sem_pending;      /* pending operations to be processed 阻塞訊號量 */    struct sem_queue **sem_pending_last;    /* last pending operation 最後一個阻塞訊號量 */    struct sem_undo *undo;          /* undo requests on this array undo隊列 */    unsigned short  sem_nsems;      /* no. of semaphores in array 訊號量數 */};

訊號量的資料結構定義如下:

from /usr/src/kernels/xxx/include/linux/sem.hxxx 為 uname -r 命令所得struct sem {    int semval;     /* current value 訊號量的值 */    int sempid;     /* pid of last operation 最近一個操作的進程號PID */};
Linux 訊號量管理操作

1.建立訊號量集合

#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>/* * 第一個參數為 key 值,一般由 ftok() 函數產生 * 第二個參數為建立的訊號量個數,以數組的方式儲存 * 第三個參數用來標識訊號量集合的許可權 */int semget(key_t key, int nsems, int semflg);

2.控制訊號量集合、訊號量

#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>/*  * 第一個參數為要操作的訊號量標識符 * 第二個參數,如果要操作的是訊號量則它是訊號量的下標;如果操作集合,此參數無意義 * 第三個參數為要執行的操作 * 第四個參數則需根據第三個參數進行設定,其類型為 senum 的共用體 */int semctl(int semid, int semnum, int cmd, ...);semun 共用體如下: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                                           (Linux-specific) */};

3.訊號量的操作

#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>/* * 第一個參數為要操作的訊號量的標識符 * 第二個參數為 sembuf 結構體 * 第三個參數為 sops 個數 */int semop(int semid, struct sembuf *sops, unsigned nsops);sembuf 結構體如下:struct sembuf {    unsigned short  sem_num;    /* semaphore index in array 訊號量下標 */    short       sem_op;         /* semaphore operation 訊號量操作 */    short       sem_flg;        /* operation flags 操作標識 */};sem_flg 為操作標識。可選為以下各值:IPC_NOWAIT:在對訊號量集合的操作不能執行的情況下,調用立即返回。SEM_UNDO:當進程退出後,該進程對 sem 進行的操作將被撤銷。
程式執行個體

下面用一個程式來示範 SEM_UNDO 的效果:

#include <stdio.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <unistd.h>#include <stdlib.h>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 */}; static void sem_init(int id){    union semun sem;    sem.val = 10;    /* 初始化訊號量的值 */    semctl(id, 0, SETVAL, sem);}static void sem_v(int id){    struct sembuf buf = {        .sem_num = 0,        .sem_op = -1,        /* 可改為 SEM_UNDO 查看結果 */    //  .sem_flg = 0,        .sem_flg = SEM_UNDO,    };    /* 操作訊號量 */    semop(id, &buf, 1);}static int get_val(int id){    /* 擷取訊號量的值 */    return semctl(id, 0, GETVAL);}int main(){    int sem_id, pid;    /* 建立訊號量集合 */    sem_id = semget((key_t)1004, 1, IPC_CREAT | 0600);    sem_init(sem_id);    if((pid = fork()) == -1){        perror("fork Err");        exit(0);    }    else if(!pid){        sem_v(sem_id);              printf("child : %d \n", get_val(sem_id));    }    else{        sleep(1);        printf("parent : %d \n", get_val(sem_id));}    return 0;}

如果未採用 SEM_UNDO 標識,子進程輸出 9 ,父進程輸出 9;

如果採用了 SEM_UNDO 標識,子進程輸出 9,父進程輸出 10。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.