Linux程序通訊之訊號量

2021-10-12 01:58:08 字數 3508 閱讀 4827

雖然本文是記錄使用訊號量保證程序的同步與互斥的,但是其實也可以看做是程序之間的通訊問題,為了與前面的保持一致,所以還是叫做 linux程序間通訊了!

程序間通訊的方式有管道、訊息佇列、共享記憶體這些都是程序間的資訊通訊,而訊號量可以理解為程序使用的臨界資源的狀態說明,訊號量主要用於保證同步與互斥

由此可見我們之前用於程序間通訊的管道,訊息佇列,共享記憶體都是臨界資源,管道是核心已經提供了同步與互斥,但是訊息佇列和共享記憶體都是不保證同步與互斥的

訊號量:本質上是一把計數器

如果乙個訊號只有0或者1,那麼這個就是二元訊號量,所以二元訊號量可以實現互斥鎖

p操作:計數器--

v操作:計數器++

訊號量本身也是臨界資源,所以p、v操作必須是原子的

struct

ipc_perm ;

//訊號量集的結構

struct

semid_ds

作用:用於建立訊號量集

#include

#include

#include

intsemget

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

;

key訊號集的名字,這個與再建立管道、訊息佇列、共享記憶體等用的key是一致的

nsems訊號集中訊號量的個數,一般為1(訊號集底層就是陣列)

sem***同建立訊息佇列等一樣的許可權,sem_flags取兩個值,ipc_createipc_excl,需要配許可權使用

return成功返回乙個非負整數,即該訊號集的標識碼;失敗返回-1

num_sems:訊號量的數目,

作用:用於控制訊號量集

#include

#include

intshmctl

(int shmid, int semnum, int cmd, ...)

;

shmid這個就是要控制的訊號量集

semnum這個是具體要控制的訊號量,因為shmid只能指明是哪乙個訊號量集(陣列),而semnum就是陣列下標

cmd將要採取的動作(有三個可取值)

作用:修改訊號量集中的值

#include

#include

#include

intsemop

(int semid, struct sembuf *sops, unsigned nsops)

;

semid這個就是要修改的訊號量集

sops如下結構體的指標,這個結構體是這樣的:

struct

sembuf;

nsops訊號量的個數

return成功返回0,失敗返回1

makefile

test:comm.c main.c

gcc -o $@

$^.phony:clean

clean:

rm -rf $@

comm.c&&comm.h&&main.c

#ifndef __comm_h__

#define __comm_h__

#include

#include

#include

#include

#include

#include

#define pathname "."

#define proj_id 0x6666

union semun ;

intcreatesemset

(int nums)

;int

initsem

(int semid, int nums, int initval)

;int

getsemset

(int nums)

;int

p(int semid, int who)

;int

v(int semid, int who)

;int

destorysemset

(int semid)

;#endif

//!__comm_h__

#include

"comm.h"

static

intcommsemset

(int nums, int flags)

int semid = semget(_key, nums, flags);

if(semid < 0)

return semid;

}int

createsemset

(int nums)

intgetsemset

(int nums)

intinitsem

(int semid, int nums, int initval)

return0;}

static

intcommpv

(int semid, int who, int op)

return0;}

intp

(int semid, int who)

intv

(int semid, int who)

intdestorysemset

(int semid)

return ret;

}#include

"comm.h"

intmain()}

else

wait(null);

}destorysemset(semid);

return0;}

開啟pv操作時與未開啟時的對比:

同樣的使用ipcs -s命令即可檢視訊號量,使用ipcrm -s即可釋放訊號量資源訊息佇列

共享記憶體

訊號量賞

謝謝你請我喝咖啡

支付寶

程序通訊之訊號量

1 訊號和訊號量 訊號與訊號量是不同的兩種事物。訊號量是用來調協程序對共享資源的訪問的。為了防止出現因多個程式同時訪問乙個共享資源而引發的一系列問 題,通過生成並使用令牌來授權,在任一時刻只能有乙個執行執行緒訪問 的臨界區域。臨界區域是指執行資料更新的 需要獨佔式地執行,而訊號量就可以提供這樣的一種...

程序通訊之訊號量

一 訊號量 訊號燈 概念 訊號量提供一種訪問機制,讓乙個臨界區同一時間只有乙個程序在訪問他,也就是說訊號量用來協調程序對共享資源的訪問的。訊號量是乙個特殊的變數,程式對其訪問都是原子操作,只允許對他進行等待 p 和傳送資訊 v 的操作。最簡單的訊號量只能取0和1的變數,這也是訊號量最常見的一種形式,...

程序通訊之訊號量

程序通訊之訊號量 一 引言 我們知道在一條單軌鐵路上,任何時候在上面只能有一列列車行駛在上面。而管理這條鐵路的系統就是訊號量,任何一列列車必須等到表明可以行駛的訊號確認以後才能進入鐵路。當一列列車進入軌道行駛時,需要將軌道改為禁止其他列車進入,從而防止不知情的列車進入軌道,發生衝突。而當列車行駛完這...