Linux程序間通訊(二) 共享記憶體 訊息佇列

2021-06-01 05:02:22 字數 1974 閱讀 2516

一、共享記憶體

最高效的程序間通訊機制。多個程序共享一段記憶體。需要依靠某種同步機制,如互斥鎖或訊號量。

通常步驟為:建立 -> 對映 -> 使用 -> 撤銷對映 ->刪除

相關函式可以參考:linux 共享記憶體

#include#include#include#include#include#include"semcom.c"  

#define size 100

int main()else

printf("create memory: %d\n",shmid);

system("ipcs -m"); //顯示共享記憶體情況

if((pid = fork())<0)else if(pid == 0)else

printf("child attach memory:%p\n",shm_addr);

system("ipcs -m");

fgets(buf,size,stdin);

strcpy(shm_addr,buf);

//撤銷對映

if(shmdt(shm_addr)<0)else

printf("child de-attach memory\n");

system("ipcs -m");

exit(0);

}elseelse

printf("parent attach memory:%p\n",shm_addr);

system("ipcs -m");

waitpid(pid,null,0);

strcpy(buf,shm_addr);

printf("parent say:%s\n",shm_addr);

system("ipcs -m");

if(shmdt(shm_addr)<0)else

system("ipcs -m");

//刪除共享記憶體

if(shmctl(shmid,ipc_rmid,null)<0)else

system("ipcs -m");

} return 0;

}

二、訊息佇列

通常的步驟:建立或開啟訊息佇列 -> 新增訊息 -> 讀取訊息 ->控制訊息佇列。

相關細節之處可以參考:linux訊息佇列

傳送訊息:

#include#include#include#include#include#include"semcom.c"  

#define size 100

struct message;

int main()

while(1)

msg.msg_type=getpid();

//最後乙個引數表示阻塞程序直到傳送成功為止

if(msgsnd(qid,&msg,strlen(msg.msg_text),0)<0)

if(strncmp(msg.msg_text,"quit",4) == 0)

} return 0;

}

接收訊息:

#include#include#include#include#include#include"semcom.c"  

#define size 100

struct message;

int main()

do

printf("msg from queue %s\n",msg.msg_text);

}while(strncmp(msg.msg_text,"quit",4));

if((msgctl(qid,ipc_rmid,null))<0)

return 0;

}

Linux程序間通訊 共享記憶體

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

Linux程序間共享記憶體通訊

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

Linux程序間通訊 共享記憶體

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