一、shmget函數介紹
shmget函數是Linux中用於創建共享內存的函數,其定義如下:
#include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg);
shmget函數的三個參數分別是key、size以及shmflg。
二、key參數詳解
key參數用於指定共享內存的唯一標識符。它可以是由ftok函數生成的標識符,也可以是在共享內存創建之前由IPC_PRIVATE指定的私有標識符。
ftok函數的定義如下:
#include <sys/types.h> #include <sys/ipc.h> key_t ftok(const char *pathname, int proj_id);
ftok函數會根據pathname參數和proj_id參數生成一個標識符,用於唯一標識一個共享內存對象。
例如,在以下示例中,我們創建了一個key用於共享內存:
#include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #define SHM_SIZE 1024 int main() { key_t key; int shmid; char *shm, *s; key = ftok(".", 'a'); //生成key shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666); //創建共享內存 if (shmid == -1) { perror("shmget"); return 1; } return 0; }
在上述示例中,我們使用ftok函數生成了一個key以便創建共享內存。
三、size參數詳解
size參數用於指定要創建的共享內存的大小。
例如,在以下示例中,我們創建了一個大小為1024字節的共享內存:
#include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #define SHM_SIZE 1024 int main() { key_t key; int shmid; char *shm, *s; key = ftok(".", 'a'); shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666); //創建大小為1024字節的共享內存 if (shmid == -1) { perror("shmget"); return 1; } return 0; }
四、shmflg參數詳解
shmflg參數用於指定共享內存的訪問權限和控制選項。它的值可以是以下常量的或運算結果:
- IPC_CREAT:如果共享內存不存在,則創建共享內存
- IPC_EXCL:如果共享內存已存在,則創建失敗
- IPC_NOWAIT:如果創建共享內存失敗,則立即返回錯誤
- 0666:指定共享內存的訪問權限
例如,在以下示例中,我們創建了一個權限為0666,大小為1024字節的共享內存:
#include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #define SHM_SIZE 1024 int main() { key_t key; int shmid; char *shm, *s; key = ftok(".", 'a'); shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666); //創建權限為0666,大小為1024字節的共享內存 if (shmid == -1) { perror("shmget"); return 1; } return 0; }
五、使用共享內存
創建完共享內存之後,我們就可以通過shmat函數將它附加到進程的地址空間,並進行讀寫操作了。
shmat函數的定義如下:
#include <sys/types.h> #include <sys/shm.h> void *shmat(int shmid, const void *shmaddr, int shmflg);
例如,在以下示例中,我們創建了一個共享內存,然後將其附加到進程的地址空間,並寫入了一些數據:
#include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <string.h> #define SHM_SIZE 1024 int main() { key_t key; int shmid; char *shm, *s; key = ftok(".", 'a'); shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666); //創建共享內存 if (shmid == -1) { perror("shmget"); return 1; } shm = shmat(shmid, NULL, 0); //將共享內存附加到進程地址空間 if (shm == (char *) -1) { perror("shmat"); return 1; } strcpy(shm, "hello, world"); //在共享內存中寫入數據 return 0; }
六、刪除共享內存
當我們不再需要使用共享內存時,需要使用shmctl函數將其從系統中刪除。
shmctl函數的定義如下:
#include <sys/ipc.h> #include <sys/shm.h> int shmctl(int shmid, int cmd, struct shmid_ds *buf);
要刪除共享內存,需要先將其從進程地址空間中分離,然後調用shmctl函數將其刪除。例如,以下示例展示了如何刪除前面創建的共享內存:
#include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <string.h> #define SHM_SIZE 1024 int main() { key_t key; int shmid; char *shm, *s; struct shmid_ds shmds; key = ftok(".", 'a'); shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666); //創建共享內存 if (shmid == -1) { perror("shmget"); return 1; } shm = shmat(shmid, NULL, 0); //將共享內存附加到進程地址空間 if (shm == (char *) -1) { perror("shmat"); return 1; } strcpy(shm, "hello, world"); //在共享內存中寫入數據 shmdt(shm); //將共享內存從進程地址空間中分離 shmctl(shmid, IPC_RMID, &shmds); //刪除共享內存 return 0; }
七、小結
本文從key、size和shmflg三個參數的介紹入手,對shmget函數做了詳細的講解,並通過代碼示例闡述了共享內存的創建、寫入、讀取和刪除等操作。在實際開發中,共享內存作為一種高效的進程間通信方式,可以有效地提高程序的性能和並發能力。
原創文章,作者:OLVES,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/332567.html