Linux學習筆記之IPC 物件之訊號量集

2021-10-06 11:20:34 字數 2847 閱讀 9349

目的:配合共享記憶體完成程序間通訊;

使用框架:

key ==>申請訊號量集 ==》pv操作 ===》解除安裝刪除訊號量集

semget() semop() semctl()

1、申請訊號量

#include

int semget(key_t key, int nsems, int sem***);

功能:該函式可以使用特定的key向核心提出訊號量集使用申請;

引數:key 唯一鍵值

nsems 要申請的訊號量個數;

sem*** 申請訊號量的方式,ipc_creat ipc_excl

返回值:成功 semid 訊號量集id

失敗 -1;

2、pv操作:

p 操作: 申請資源 sem_wait() ===>sem = sem -1;

v 操作: 釋放資源 sem_post() ===>sem = sem +1;

int semop(int semid, struct sembuf sops, unsigned nsops);

功能:該函式可以完成訊號量集中指定訊號量的pv操作;

引數: semid 訊號量集id

sops 訊號量集針對pv操作組織的結構體:如下

struct sembuf

nsops 操作訊號量的個數;

返回值:成功 0

失敗 -1;

3、刪除訊號量:

int semctl(int semid, int semnum, int cmd, …);

功能:該函式可以修改訊號量集合中指定訊號量的屬性,也可以刪除訊號量;

引數:semid 要刪除的訊號量集id

semnum 要刪除的訊號量集中的訊號量編號

cmd ipc_rmid 刪除訊號量的巨集

… 可變長引數,取決與cmd 的巨集,一般猶如下兩個巨集:

cmd == setval 則 可變長部分可以傳入乙個初始值

cmd == getval 則 可變長部分可以不傳資料,函式執行

的返回值就是獲取值

返回值:成功 0

失敗 -1;

//訊號燈寫

#include

#include

#include

#include

#include

#include

#include

#define n 32

struct shmbuf

;union semun

;int

main()

int shmid;

struct shmbuf *shm;if(

(shmid=

shmget

(key,

512,ipc_creat|ipc_excl|

0664))

<0)

else}if

((shm=

shmat

(shmid,

null,0

))!=null

)int semid;

union semun semun;

struct sembuf sembuf;if(

(semid=

semget

(key,

2,ipc_creat|ipc_excl|

0664))

<0)

else

}else

while(1

)}return0;

}

//訊號燈讀

#include

#include

#include

#include

#include

#include

#include

#define n 32

struct shmbuf

;union semun

;int

main()

int shmid;

struct shmbuf *shm;if(

(shmid=

shmget

(key,

512,ipc_creat|ipc_excl|

0664))

<0)

else}if

((shm=

shmat

(shmid,

null,0

))!=null

)int semid;

union semun semun;

struct sembuf sembuf;if(

(semid=

semget

(key,

2,ipc_creat|ipc_excl|

0664))

<0)

else

}else

while(1

)printf

("buf:%s\n"

,shm->buf)

;//釋放訊號量

sembuf.sem_num=1;

sembuf.sem_op=1;

sembuf.sem_***=0;

semop

(semid,

&sembuf,1)

;}return0;

err:

shmdt

(shm)

;shmctl

(shmid,ipc_rmid,

null);

shmctl

(semid,

0,ipc_rmid)

;shmctl

(semid,

1,ipc_rmid)

;}

Linux程序間通訊 IPC 學習筆記。

ipc interprocess communication 程序間通訊 一 管道 1.無名管道 開啟與關閉管道 include int pipe int filedes 2 filedes 0 用於讀出資料,讀取時必須關閉寫入端,即close filedes 1 filedes 1 用於寫入資料,...

IPC物件之訊號量

1.訊號量 1 訊號量 semaphore 也叫訊號燈。它是不同程序間或乙個給定程序內部不同執行緒間同步的機制。2 二值訊號量 值為0或1。與互斥鎖類似,資源可用時值為1,不可用時值為0。3 計數訊號量 值在0到n之間。同來統計資源,其值代表可用資源數。4 等待操作是等待訊號量的值變為大於0,然後將...

Linux學習筆記29 IPC狀態命令

一 ipc ipc是程序間通訊,在前面,我們相繼學習了程序間通訊機制有訊號量,記憶體共享,訊息佇列。狀態命令 ipcs 和刪除命令 ipcrm 提供了一種檢查和清理ipc機制的方法。二 狀態命令 1 顯示訊號量狀態用ipcs s 2 顯示共享記憶體狀態用ipcs m 3 顯示訊息佇列狀態用ipcs ...