程式通訊之無名訊號量
程式通訊之無名訊號量
和有名訊號量類似,無名訊號也是程式之間/執行緒之間通訊的主要手段,唯一不同的是他不能用在不同程式之間。當然如果把無名訊號量放在多個程式都可以訪問的共享記憶體裡,也可以實現程式之間的通訊,但這主要還是藉助於共享記憶體的機制。下面將根據使用無名訊號量依賴的標頭檔案、需要連結的庫檔案、常用的函式分別進行介紹。
依賴標頭檔案:#include <semaphore.h>
連結依賴庫: 需要連結到libpthread.so,因此makefile裡需要指定-lpthread
重要函式列表:
int sem_init(sem_t *sem, int pshared, unsigned int value);
無名訊號量的初始化函式,這個函式體現了無名訊號量和有名訊號量的主要區別,不同於有名訊號量的初始化函式sem_open(),它不需要指定一個檔名,只需要傳遞一個程式、執行緒都可以訪問的訊號量指標進去就可以。如果需要在同一個程式的不同執行緒之間訪問,那麼pshared必須設定為0,並且第一引數必須保證每個執行緒都可以訪問;如果需要在不同程式間訪問,那麼pshared必須設定為1,並且第一個引數必須放在共享記憶體區域。這個函式的地三個引數value指定了該訊號量初始化的值,它代表系統剛開始可用的系統資源的個數。
當上面的函式返回為0時,表示函式呼叫成功;當返回為-1的時候,代表出錯,錯誤程式碼放在errno裡面,可以通過strerror(errno)列印出來。
int sem_post(sem_t *sem);
unlock無名訊號量,並且把可用的資源個數加1,喚醒等待當前訊號量的執行緒或程式,讓被喚醒的程式或執行緒可以拿到鎖。函式返回值同上。
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
上面的三個函式都能查詢當前有沒有可用資源,如果有:就搶到鎖並把當前可用的資源數目減1。如果沒有可用資源:不同的是sem_wait()會把當前程式或執行緒加入到休眠佇列,直到被喚醒;而sem_trywait()函式在系統沒有可用資源的情況下會立即返回錯誤,並把錯誤程式碼設定為EAGAIN,當前程式或執行緒不會被阻塞;而sem_timewait()在沒有可用資源的情況下,最長會被阻塞abs_timeout的時長,然後返回錯誤,並把錯誤程式碼設定為ETIMEDOUT。
int sem_getvalue(sem_t *sem, int *sval);
得到當前訊號量的值(代表當前系統可用資源的數量),並把它放到sval指向的記憶體裡面。
程式碼示例
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <fcntl.h> /* For O_* constants */
#include <sys/stat.h> /* For mode constants */
#include <semaphore.h>
#include <errno.h>
sem_t clnt_sem;
int create_done = 0;
void state_thread1()
{
while(1) {
if (!create_done) continue;
printf("%s: Wait semp....\n", __FUNCTION__);
sem_wait(&clnt_sem);
printf("%s: Wait semp done: semp comes\n", __FUNCTION__);
}
}
void state_thread2()
{
while(1) {
printf("%s: Wait semp....\n", __FUNCTION__);
sem_wait(&clnt_sem);
printf("%s: Wait semp done: semp comes\n", __FUNCTION__);
sleep(10);
}
}
void main(void)
{
pthread_t ftids;
int ret;
ret = sem_init(&clnt_sem,0, 3);
if (ret < 0) {
printf("%s\n", strerror(errno));
}
pthread_create(&ftids, NULL, (void *)state_thread1, NULL);
pthread_create(&ftids, NULL, (void *)state_thread2, NULL);
create_done = 1;
sem_post(&clnt_sem);
while(1) {
printf("IN Clnt main process\n");
sleep(10);
}
編譯和執行結果:
[xqch@localhost testcases]$ gcc -o sem_nameless sem_nameless.c -lpthread
[xqch@localhost testcases]$ ./sem_nameless
IN Clnt main process
state_thread2: Wait semp....
state_thread2: Wait semp done: semp comes
state_thread1: Wait semp....
state_thread1: Wait semp done: semp comes
state_thread1: Wait semp....
state_thread1: Wait semp done: semp comes
state_thread1: Wait semp....
state_thread1: Wait semp done: semp comes
state_thread1: Wait semp....
IN Clnt main process
state_thread2: Wait semp....
本文轉自儲存之廚51CTO部落格,原文連結:http://blog.51cto.com/xiamachao/1791534 ,如需轉載請自行聯絡原作者
相關文章
- 程式間通訊——POSIX 有名訊號量與無名訊號量
- Linux 程式間通訊之System V 訊號量Linux
- 無名訊號量實現相關程式同步
- Linux程式間通訊——使用訊號量Linux
- 程序間通訊(4)-訊號量
- 無名訊號量實現哲學家問題
- 程式間通訊機制(管道、訊號、共享記憶體/訊號量/訊息佇列)、執行緒間通訊機制(互斥鎖、條件變數、posix匿名訊號量)記憶體佇列執行緒變數
- 程序間的通訊(訊號通訊)
- 程序通訊-訊號
- 程序通訊--訊號
- linux程式間通訊-----訊號總結Linux
- 初步理解Python程式的訊號通訊Python
- 畫江湖之 PHP 多程式開發 【通過訊號量控制併發量】PHP
- python學習之訊號量Python
- 原始碼分析:Semaphore之訊號量原始碼
- POSIX 訊號量
- 程式間通訊——基於共享記憶體和訊號量實現共享佇列記憶體佇列
- liteos訊號量(八)
- django的訊號量Django
- Python 訊號量Python
- Linux 下的程式間通訊:套接字和訊號Linux
- 無線通訊
- Android 程式之間通訊Android
- uc/os-iii學習筆記-資源管理(中斷、訊號、訊號量、互斥訊號量)筆記
- 畫江湖之 Go 學習篇 【訊號量】Go
- 畫江湖之 Go 學習篇 [訊號量]Go
- 程式通訊 執行緒通訊執行緒
- 10. Semaphore ||(訊號量)
- 程式通訊
- 程式間通訊——XSI IPC之訊息佇列佇列
- linux系統程式設計之訊號(一):中斷與訊號Linux程式設計
- python中的訊號通訊 blinkerPython
- linux系統程式設計之訊號(五):訊號集操作函式,訊號阻塞與未決Linux程式設計函式
- linux 程式間通訊之FIFOLinux
- linux 程式間通訊之管道Linux
- Linux程式之間如何通訊?Linux
- Electron實戰之程式間通訊
- 學習筆記(2):go輕量級分散式與微服務-實現程式的訊號通訊2筆記Go分散式微服務