Linux 程序間通訊 共享記憶體 訊號量

2021-07-31 03:05:02 字數 2110 閱讀 6339

shm_write.c

#include 

#include

#include

#include

#include

#include

#define max_len 512

struct shm_def

;union semun

;int init_sem(int sem_id,int val)

int del_sem(int sem_id)

int sem_p(int sem_id)

int sem_v(int sem_id)

int main(int argc, char *argv)

/*對映到本程序*/

struct shm_def *p_shm_def = null;

char *p_shm = null;

p_shm = shmat(shm_id,null,shm_rnd);

if (p_shm != null)

/*建立兩個訊號量*/

int sem_can_write = semget((key_t)1200,1,ipc_creat|0777);

int sem_can_read = semget((key_t)1201,1,ipc_creat|0777);

if (sem_can_write == -1 || sem_can_read == -1)

init_sem(sem_can_write,1);

init_sem(sem_can_read,0);

while(1)

/*脫離*/

shmdt(p_shm);

return

0;}

shm_read.c

#include 

#include

#include

#include

#include

#include

#define max_len 512

struct shm_def

;union semun

;int init_sem(int sem_id,int val)

int del_sem(int sem_id)

int sem_p(int sem_id)

int sem_v(int sem_id)

int main(int argc, char *argv)

/*對映到本程序*/

struct shm_def *p_shm_def = null;

char *p_shm = null;

p_shm = shmat(shm_id,null,shm_rdonly);

if (p_shm != null)

/*獲取兩個訊號量*/

int sem_can_write = semget((key_t)1200,1,ipc_creat|0777);

int sem_can_read = semget((key_t)1201,1,ipc_creat|0777);

if (sem_can_write == -1 || sem_can_read == -1)

while(1)

/*脫離*/

shmdt(p_shm);

/*刪除共享記憶體*/

shmctl(shm_id,ipc_rmid,0);

printf("exit program!\n");

/*刪除訊號量*/

Linux程序間通訊 共享記憶體

共享記憶體是執行在同一臺機器上的程序間通訊最快的方式,因為資料不需要在不同的程序間複製。通常由乙個程序建立一塊共享記憶體區,其餘程序對這塊記憶體區進行讀寫。共享記憶體往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。首先要用的函式是shmget,它獲得乙個共享儲存識別符號。i nclu...

Linux程序間共享記憶體通訊

使用共享記憶體基本分四個步驟 獲得共享記憶體 shmget 對映共享記憶體shmat 解除對映shmdt 刪除共享記憶體shmctl 於是自己在網上找來了乙個例子看了下,並且用虛擬機器單獨跑了下共享記憶體的經典例程看了下,才知道了自己的問題出現 了 發現有時候只要自己親自將程式一步一步的去測,才知道...

Linux程序間通訊 共享記憶體

之前提到了程序間通訊的管道,訊息佇列,訊號量,然後其中訊號量是pv操作,操控的是乙個共享資源。在我們提到的ipc模組中,訊息佇列針對的是資料單元的資訊傳送,管道不屬於system v ipc的部分,所以按照乙個作業系統的整體來說,他應該也有著乙個關於位元組流的訊息傳輸,並且要比之前都要快,還要跟我們...