程序間通訊 訊號量

2021-07-14 18:10:37 字數 1389 閱讀 8893

共享記憶體最大的問題是什麼?沒錯,就是多程序競爭記憶體的問題,就像類似於我們平時說的執行緒安全問題。如何解決這個問題?這個時候我們的訊號量就上場了。訊號量的本質就是乙個計數器,用來實現程序之間的互斥與同步。例如訊號量的初始值是 1,然後 a 程序來訪問記憶體1的時候,我們就把訊號量的值設為 0,然後程序b 也要來訪問記憶體1的時候,看到訊號量的值為 0 就知道已經有程序在訪問記憶體1了,這個時候程序 b 就會訪問不了記憶體1。所以說,訊號量也是程序之間的一種通訊方式。

下面看具體**實現:

#include #include #include #include #include #include #include #include #include #ifdef __linux

union semun //macos 系統中在sys/sem.h檔案中已定義

;#endif

static int sem_id = 0;

static int set_semvalue();

static int semaphore_p();

static int semaphore_v();

static void del_semvalue();

void printcurrenttime() //列印當前時間

int main(int argc, char *argv)

//設定要輸出到螢幕中的資訊,即其引數的第乙個字元

message = argv[1][0];

sleep(2);

}for(int i = 0; i < 10; ++i)

printcurrenttime();

sleep(10);

printf("\n%d - finished\n", getpid());

printcurrenttime();

if(argc > 1)

printcurrenttime();

printf("hello world!\n");

return 0;

}static int set_semvalue()

static void del_semvalue()

static int semaphore_p()

return 1;

}static int semaphore_v()

return 1;

}

ubuntu16.4執行結果:

mac10.14.6執行結果:

參考:

程序間通訊 訊號量

ipc識別符號和關鍵字 在終端輸入ipcs,可以看到目前系統中所有的ipc資訊 第一列的key就是ipc的關鍵字,第二列是ipc的識別符號。ftok 函式用於獲得乙個ipc的關鍵字,其函式原型是 key t ftok const char pathname,int proj id 下面是乙個訊號量的...

程序間通訊 訊號量

system ipc中,對於每乙個新建的訊號量 訊息佇列 共享記憶體,都有乙個在整個系統中唯一的識別符號。每個標識也都有唯一對應的關鍵字,關鍵字的資料型別為ket t 在終端輸入命令 ipcs 可以看到目前系統中所有的ipc資訊 共享記憶體段 鍵 shmid 擁有者 許可權 位元組 nattch 狀...

程序間通訊 訊號量

訊號量不是ipc 機構,它只是乙個計數器用於不同程序之間或同一程序不同執行緒之間的同步,型別 二元訊號 值為0或 1,1說明有可用資源,0說明此時資源占用,其他程序需等待。計數訊號量 表示可用資源數量。計數訊號量集 由乙個或多個訊號量組成的集合,每乙個都是計數訊號量。訊號量資料結構 include ...