訊號量 訊息佇列 共享記憶體複習

2021-07-26 16:56:10 字數 2843 閱讀 5959

使用訊號量實現父子程序間同步:

#include 

#include

#include

#include

#include

union semun ;

void pv(int sem_id, int op)

int main(int argc, char** argv)

else

waitpid(pid, null, 0);

semctl(sem_id, 0, ipc_rmid, sem_un);

return

0;}

使用訊息佇列實現簡單的程序間交談。

utili.h標頭檔案:

#pragma once

#include

#include

#include

#include

#include

const

char* const

path_name = "pathname";

const

intpro_id = 0xff;

const

intbuffer_size = 256;

struct message ;

server.cpp:

#include "utili.h"

const int server_msg_snd_type = 10000;

const int server_msg_rcv_type = 2;

int main()

printf("msg_id = %d\n", msg_id);

message msg;

for(; ;)

msgctl(msg_id, ipc_rmid, 0);

while(1);

exit(0);

客戶端:

#include "utili.h"

const int client_msg_snd_type = 2;

const int client_msg_rcv_type = 10000;

int main()

printf("msg_key = %d\n", msg_key);

if((msg_id = msgget(msg_key, 0)) < 0)

printf("mid_id = %d\n", msg_id);

message msg;

for(; ;)

msgctl(msg_id, ipc_rmid, 0);

exit(0);

}

雙反接收和傳送的訊息型別不同,可以利用這點從訊息佇列中取自己的訊息。

昨天晚上寫訊息佇列這個程式坑了我好長時間,沒有使用perror判斷錯誤外加沒有注意到ftok函式針對的path必須是真實存在的檔案或目錄,然後找bug找了乙個半多小時。

這裡使用共享記憶體來實現伺服器和客戶端通訊,並且由於共享了讀寫,使用訊號量來同步。

utili.h:

#include 

#include

#include

#include

#include

#include

#define pathname "newfile"

#define pro_id 0xff

#define err_exit(m) \

dowhile(0)

#define use_sem

union semun ;

server.cpp:

#include "utili.h"

int main(int argc, char** argv)

union semun init;

init.val = 0;

semctl(sem_id, 0, setval, init); //

0semctl(sem_id, 1, setval, init); //

1 struct sembuf p = , v = ;

#endif

for(; ;)

semop(sem_id, &v, 1);

semop(sem_id, &p, 1);

printf("client:>%s\n", ch);

}int res;

if( (res = shmctl(shm_id, ipc_rmid, 0)) < 0)

err_exit("remove err.");

return

0;}

client.cpp:

#include "utili.h"

int main(int argc, char** argv)

union semun init;

init.val = 0;

semctl(sem_id, 0, setval, init); //

0semctl(sem_id, 1, setval, init); //

1 struct sembuf p = , v = ;

#endif

for(; ;)

semop(sem_id, &v, 1);

}int res;

if( (res = shmctl(shm_id, ipc_rmid, 0)) < 0)

err_exit("remove err.");

return

0;}

程序間通訊 共享記憶體 訊息佇列 訊號量

共享記憶體 共享記憶體是最快的程序間通訊方式,相較於其他程序間通訊方式,少了兩次核心態與使用者態之間的資料拷貝過程 原理及使用過程 在物理記憶體中開闢一塊記憶體空間 將這塊記憶體空間通過頁表對映到程序的虛擬位址空間中 程序可以直接通過程序虛擬位址空間訪問到這塊物理記憶體進行操作 若多個程序對映同一塊...

共享記憶體,訊號量

一.共享記憶體 共享記憶體 允許兩個不相關的程序訪問同乙個邏輯記憶體。為兩個正在執行的程序之間共享和傳遞資料不同程序之間共享的記憶體通常安排為同一段物理記憶體。程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問共享記憶體中的位址,是非同步通訊,也就是說,在第乙個程序結束對共享記...

共享記憶體 訊號量

1.共享記憶體 a.int shmget key t key,size t size,int shm 建立共享記憶體 參一 為共享記憶體段命名 參二 size以位元組為單位指定需要共享的記憶體容量 參三 許可權標誌 ipc creat 0644 返回值 共享記憶體識別符號 非負整數 b.void s...