一、共享記憶體
最高效的程序間通訊機制。多個程序共享一段記憶體。需要依靠某種同步機制,如互斥鎖或訊號量。
通常步驟為:建立 -> 對映 -> 使用 -> 撤銷對映 ->刪除
相關函式可以參考: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()
doprintf("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的部分,所以按照乙個作業系統的整體來說,他應該也有著乙個關於位元組流的訊息傳輸,並且要比之前都要快,還要跟我們...