Linux 程序間通訊 訊號量

2022-05-31 22:21:12 字數 3289 閱讀 5733

程序是乙個獨立的資源管理單元,不同程序間的資源是獨立的,不能在乙個程序中訪問另乙個程序的使用者空間和記憶體空間。但是,程序不是孤立的,不同程序之間需要資訊的互動和狀態的傳遞,因此需要程序間資料的傳遞、同步和非同步的機制。

當然,這些機制不能由哪乙個程序進行直接管理,只能由作業系統來完成其管理和維護,linux提供了大量的程序間通訊機制,包括同乙個主機下的不同程序和網路主機間的程序通訊,如下圖所示:

所謂訊號量,主要用來實現程序間同步,避免併發訪問共享資源;同時,訊號量也可以標記資源的個數。

/*  come from /usr/include/linux/sem.h  */

struct semid_ds

;struct sem

/*  come from /usr/include/linux/sem.h  */

struct seminfo

;

針對訊號量的不同操作,semctl的第四個引數有所不同,為了方便起見,一般我們使用乙個聯合體對所有的可能性進行封裝(自行封裝,系統無此聯合體

union semun

;

可通過該結構體實現訊號量的p(get)、v(release)操作,具體看sem_op的值為正(v)還是負(p)

/*  come from /usr/include/linux/sem.h  */

/* semop system calls takes an array of these. */

struct sembuf ;

macro

no.description

ipc_creat

00001000

若key不存在,這建立

ipc_excl

00002000

若key存在,返回失敗

ipc_nowait

00004000

若需要等待,直接返回錯誤

macro

no.description

return

argument 4

ipc_rmid0刪除

以下皆針對整個訊號量集合,/usr/include/linux/ipc.h

ipc_set

1設定ipc_perm引數

struct semid_ds

ipc_stat

2獲取ipc_perm引數

struct semid_ds

ipc_info

3獲取系統資訊

struct seminfo

getpid

11獲取訊號量擁有者的pid

以下皆針對某個訊號量 /usr/include/linux/sem.h

getval

12獲取訊號量的值,函式返回訊號的值

當前訊號量的值:程序數; 失敗:-1

getall

13獲取所有訊號量的值

成功:0; 失敗:-1

陣列位址

getncnt

14獲取等待訊號量遞增的程序數

成功:程序數; 失敗:-1

getzcnt

15獲取等待訊號量值遞減的程序數

成功:程序數; 失敗:-1

int value (訊號量的值)

setval

16設定訊號量的值,設定的值在第四個引數中

成功:0; 失敗:-1

setall

17設定所有訊號量的值

成功:0; 失敗:-1

陣列位址

生產者/消費者問題,經典pv問題,具體過程如下圖所示:

本例**分為兩個檔案:

customer.c :

producer.c :

producer.c

/*

* filename: producer.c

*/#include #include #include #include #include #include #include #include int sem_id;

int init(void)

arg;

key = ftok(".", 0xff);

if(-1 == key)

sem_id = semget(key, 2, ipc_creat|0644);

if(-1 == sem_id)

sem_array[0] = 0;

sem_array[1] = 100;

arg.array = sem_array;

if(-1 == (semctl(sem_id, 0, setall, arg)))

printf("produce init is %d\n", semctl(sem_id, 0, getval));

printf("space init is %d\n", semctl(sem_id, 1, getval));

return 0;

}void del()

int main()

printf("this is producer:\n");

while(1)

del();

return 0;

}

customer.c

/*

* filename: producer.c

*/#include #include #include #include #include #include #include int sem_id;

int init(void)

return 0;

}void del()

int main()

printf("this is customer:\n");

while(1)

del();

return 0;

}

linux 訊號量(程序間通訊)

將使用乙個程式來演示訊號量的使用,程式用pv操作控制訊號量,以操作臨界區,p操作讓訊號量減1,v操作讓訊號量加1,而pv操作之間的 即為臨界區關鍵 每次只能由乙個程序訪問。程式建立出乙個子程序,在兩個程序中分別有一段臨界區關鍵 實現的功能都是不斷的順序輸出0 9的字元。保證程序間同步 plain v...

linux 程序間通訊 訊號量

例項中首先使用fork 建立乙個子程序,在父程序呼叫kill 之前,在子程序中使用raise 向自身傳送sigstop訊號,是子程序暫停。接下來使用kill 向子程序傳送訊號 ngnsvr9 none home xionghailong example cat kill raise.c includ...

Linux 程序間通訊 訊號量

linux學習目錄 1 什麼是訊號量?在對於臨界區資源管理過程中,為了防止多個程式同時訪問乙個共享資源而引發的一系列問題。比如 死鎖。為了解決這種問題,巨人們就發明了訊號量。訊號量就是為了解決在乙個臨界區只有乙個程序訪問它,也就是說訊號量相當於交警,來協調程序對共享資源有序的訪問而不造成死鎖等行為。...