訊號量(semaphore)是一種用於提供不同程序之間或者乙個給定的不同執行緒間同步手段的原語。訊號量多用於程序間的同步與互斥,簡單的說一下同步和互斥的意思:
同步:處理競爭就是同步,安排程序執行的先後順序就是同步,每個程序都有一定的先後執行順序。
互斥:互斥訪問不可共享的臨界資源,同時會引發兩個新的控制問題(互斥可以說是特殊的同步)。
競爭:當併發程序競爭使用同乙個資源的時候,我們就稱為競爭程序。
共享資源通常分為兩類:一類是互斥共享資源,即任一時刻只允許乙個程序訪問該資源;另一類是同步共享資源,即同一時刻允許多個程序訪問該資源;訊號量是解決互斥共享資源的同步問題而引入的機制。
訊號量通訊機制主要用來實現程序間同步,避免併發訪問共享資源。訊號量可以標識系統可用資源的個數。最簡單的訊號量為二元訊號量。
當有程序要求使用共享資源時,需要執行以下操作:
1.系統首先要檢測該資源的訊號量;
2.若該資源的訊號量值大於0,則程序可以使用該資源,此時,程序將該資源的訊號量值減1;
3.若該資源的訊號量值為0,則程序進入休眠狀態,直到訊號量值大於0時程序被喚醒,訪問該資源;
當程序不再使用由乙個訊號量控制的共享資源時,該訊號量值增加1,如果此時有程序處於休眠狀態等待此訊號量,則該程序會被喚醒。
下圖為 linux 訊號量通訊機制的概念圖。在實際應用中,兩個程序通訊可能會使用多個訊號量,因此,linux 在管理時以訊號量集合的概念來管理。
具體**如下,可以直接編譯測試:
sem_comm.c
#include"sem_comm.h"
int sem_p(int smd_id, int sn)
int sem_v(int smd_id, int sn)
int sem_create(key_t sem_key)
printf("there is a semaphore in the system\n");
//返回乙個存在的sem id
sem_id = semget(sem_key,1,0666);
if (-1 == sem_id)
}printf("sem_id=%x\n", sem_id);
return sem_id;
}//sn代表訊號的序號,第乙個從0開始.
int sem_init(int sem_id, int val , int sn)
//指定獲取第幾個訊號值, 預設sn一般為0
int sem_getval(int semid, int sn)
//刪除sem_id 訊號量
int sem_del(int sem_id)
return 0;
}
sem_comm.h
#pragma once
#include #include #include #include #include #include #include #include //本聯合未在出現在任何系統標頭檔案中,因此必須由應用程式宣告
union semun;
#define err_exit(m) \
do \
while(0)
int sem_create(key_t sem_key);
int sem_init(int sem_id, int val , int sn);
int sem_getval(int semid, int sn);
int sem_p(int smd_id, int sn);
int sem_v(int smd_id, int sn);
int sem_del(int sem_id);
sem_test.c
#include"sem_comm.h"
int main(int argc, char const *ar**)
else if (pid == 0)else
return 0;
}
makefile
.phony: all clean
all:sem_test
sem_test:sem_test.o sem_comm.o
gcc -o $@ $^
%.o:%.c
gcc -c $<
clean:
rm -rf sem_test *.o
程序間通訊第三章(System V IPC)
1.概述 system v ipc的三種型別 system v訊息佇列 system v訊號量 system v共享記憶體區 2.key t鍵和ftok函式 三種型別的system v ipc使用key t鍵作為它們的名字,key t在標頭檔案定義,通常至少為32位整數值。函式ftok把乙個已存在的...
程序間通訊2 通訊方式及各自特點
經常使用到的程序間通訊有 管道 訊息佇列和共享記憶體。管道最開始出現的管道是用於具有血緣關係的程序之間共享資料的。父程序首先建立乙個管道,然後再fork 出子程序,子程序自動共享對管道的訪問許可權。這種管道是沒有名字的 只有程序中的乙個識別符號進行標識 因此也稱為匿名管道。如我們在shell中執行 ...
程序通訊 程序管道
程序間通訊的幾種常用方式 管道 命名管道 訊號 訊號量 共享記憶體 訊息佇列 套接字。管道 pipe 一種半雙工的通訊方式,資料只能單向流動且只能在具有共同祖先的程序間使用。命名管道 name pipe 也是一種半雙工的通訊方式,但他允許不相關程序間的通訊。訊號 sinal 乙個程序通過訊號通知其他...