程序間通訊 共享記憶體

2021-05-27 16:53:49 字數 2504 閱讀 2878

共享記憶體是被多個程序共享的一部分物理記憶體。共享記憶體是程序間共享資料的一種最快的方式,乙個程序向共享記憶體區域寫入資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。

共享記憶體實現分兩個步驟:

建立共享記憶體,使用shmget函式

對映共享記憶體,使用shmat函式

共享記憶體是一種最為高效的程序間通訊方式。因為程序可以直接讀寫記憶體,不需要任何資料的拷貝。為了在多個程序間交換資訊,核心專門留出了一塊記憶體區。這段記憶體區可以由需要訪問的程序將其對映到自己的私有位址空間。因此,程序就可以直接讀寫這一記憶體區而不需要進行資料的拷貝,從而大大提高了效率。當然,由於多個程序共享一段記憶體,因此也需要依靠某種同步機制,如互斥鎖和訊號量等 。

/*shmem.c*/

#include

#include

#include

#include

#include

#include

#define buffer_size 2048

int main()

pid_t pid;

int shmid;

char *shm_addr;

char flag="wrote";

char *buff;

/*建立共享記憶體*/

if((shmid=shmget(ipc_private,buffer_size,0666))<0)

perror("shmget");

exit(1);

else

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

/*顯示共享記憶體情況*/

system("ipcs -m");

pid=fork();

if(pid==-1)

perror("fork");

exit(1);

else if(pid==0)/*子程序*/

/*對映共享記憶體*/

if((shm_addr=shmat(shmid,0,0))==(void *)-1)

perror("child:shmat");

exit(1);

else

printf("child:atttach shared-memory:%p\n",shm_addr);

system("ipcs -m");

/*通過檢查在共享記憶體的頭部是否標誌字串"worte"來確認*/

/*父程序已經向記憶體寫入有效資料*/

while(strncmp(shm_addr,flag,strlen(flag)))

printf("child:wait for enable data:...\n");

sleep(5);

/*獲取共享記憶體有效資料並顯示*/

strcpy(buff,shm_addr+strlen(flag));

printf("child:shared-mempory:%s\n",buff);

/*解除共享記憶體對映*/

if((shmdt(shm_addr))<0)

perror("shmdt");

exit(1);

else

printf("child:deattach shared-memory\n");

system("ipcs -m");

/*刪除共享記憶體*/

if(shmctl(shmid,ipc_rmid,null)==-1)

perror("child:shmctl(ipc_rmid)\n");

exit(1);

else

printf("delete shared-memory\n");

system("ipcs -m");

else

/*對映共享記憶體*/

if((shm_addr=shmat(shmid,0,0))==(void *)-1)

perror("parent:shmat");

exit(1);

else

printf("parent:atttach shared-memory:%p\n",shm_addr);

sleep(1);

printf("\ninput some string:\n");

fgets(buff,buffer_size,stdin);//fgets是阻塞型字串輸入

strncpy(shm_addr+strlen(flag),buff,strlen(buff));

strncpy(shm_addr,flag,strlen(flag));

/*解除共享記憶體*/

if((shmdt(shm_addr))<0)

perror("shmdt");

exit(1);

else

printf("child:deattach shared-memory\n");

system("ipcs -m");

waitpid(pid,null,0);

printf("finished\n");

exit(0);

程序間通訊 共享記憶體

下面是自己寫的乙個簡單的共享記憶體的程序間通訊的例子。共享記憶體是用於程序間大量資料共享的一種方法。include include include include include include int main if buf1 shmat shmid,0,0 void 1 strcpy buf1,...

程序間通訊 共享記憶體

共享記憶體允許兩個或更多程序共享一塊給定的儲存區,因為資料不需要在不同程序之間訪問,這是最快的一種ipc 傳輸資訊量很大,通過記憶體空間對映程序空間實現,若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應取這些資料,通常訊號量用來實現對共享儲存訪問的同步。核心為每個共享儲存段...

共享記憶體 程序間通訊

讀程序 include include include include include include include include shm com.h int main void 對映共享記憶體 shared memory shmat shmid,void 0,0 if shared memor...