可以用man 2 shmget查詢相關資料
需要include
sys/shm.h
主要有四個function:
- shmget() - 建立共享記憶體
- shmat() - attach 共享記憶體
- shmdt() - detach 共享記憶體
- shmctl() - 設定共享記憶體
int shmget(key_t key, size_t size, int shmflg);
- key可以這樣用:(key_t)1234
- size:以byte為單位的大小
- shmflag:
IPC_CREATE | 0666
(0666是權限) - 若shmflag內有IPC_EXCL 則表示:
若之前用同一個key建立過share memory,則此次建立會失敗(防止用到已創立過的)
若沒用這flag就會連接到同一個地方 - 回傳值是shmid,錯誤時則會回傳-1
- attach會把個shmid的share memory的位址放到shmaddr
- 若失敗則shmaddr為-1
- detach
若要移除已經建立的share memory,須使用shmctl:
先拿到shmid之後,用shmctl即可移除
shmctl(shmid,IPC_RMID,0);
寫個簡單範例.
#include#include int main(int argc, char* argv[]){ int data[100]; int shmid; void *shared_memory = (void *)0; shmid = shmget ((key_t) 123, sizeof (int) * 100, 0666 | IPC_CREAT); if (shmid == -1) { fprintf (stderr, "shmget failed\n"); exit (1); } shared_memory = shmat (shmid, (void *)0, 0); if (shared_memory == (void *)-1) { fprintf (stderr, "shmat failed\n"); exit (1); } printf ("Memory attached at %X\n", shared_memory); if(argc == 2 && strcmp(argv[1], "-d") == 0){ printf("reset data to 0!\n"); ((int *)shared_memory)[0] = 0; } printf("old data:%d\n", ((int *)shared_memory)[0]++); printf("new data:%d\n", ((int *)shared_memory)[0]); exit(0); }
沒有留言:
張貼留言