Linux系統程式設計之程式間通訊方式:共享記憶體例項演示

千鋒教育官方發表於2019-09-18

實戰示例

接下來我們做這麼一個例子:建立兩個程式,在 A 程式中建立一個共享記憶體,並向其寫入資料,透過 B 程式從共享記憶體中讀取資料。

寫端程式碼如下:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

 

#define BUFSZ 512

 

int main(int argc, char *argv[])

{

int shmid;

int ret;

key_t key;

char *shmadd;

//建立key值

key = ftok("../", 2015);

if(key == -1)

{

perror("ftok");

}

//建立共享記憶體

shmid = shmget(key, BUFSZ, IPC_CREAT|0666);

if(shmid < 0)

{

perror("shmget");

exit(-1);

}

//對映

shmadd = shmat(shmid, NULL, 0);

if(shmadd < 0)

{

perror("shmat");

_exit(-1);

}

//複製資料至共享記憶體區

printf("copy data to shared-memory\n");

bzero(shmadd, BUFSZ); // 共享記憶體清空

strcpy(shmadd, "how are you, lh\n");

return 0;

}

 

讀程式碼:

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

 

#define BUFSZ 512

int main(int argc, char *argv[])

{

int shmid;

int ret;

key_t key;

char *shmadd;

//建立key值

key = ftok("../", 2015);

if(key == -1)

{

perror("ftok");

}

system("ipcs -m"); //檢視共享記憶體

//開啟共享記憶體

shmid = shmget(key, BUFSZ, IPC_CREAT|0666);

if(shmid < 0)

{

perror("shmget");

exit(-1);

}

//對映

shmadd = shmat(shmid, NULL, 0);

if(shmadd < 0)

{

perror("shmat");

exit(-1);

}

//讀共享記憶體區資料

printf("data = [%s]\n", shmadd);

//分離共享記憶體和當前程式

ret = shmdt(shmadd);

if(ret < 0)

{

perror("shmdt");

exit(1);

}

else

{

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

}

//刪除共享記憶體

shmctl(shmid, IPC_RMID, NULL);

system("ipcs -m"); //檢視共享記憶體

return 0;

}

 

執行結果:

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69914734/viewspace-2657404/,如需轉載,請註明出處,否則將追究法律責任。

相關文章