http://www.ecst.csuchico.edu/~beej/guide/ipc/shmem.html可以用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
void *shmat(int shmid, const void *shmaddr, int shmflg);- attach會把個shmid的share memory的位址放到shmaddr
- 若失敗則shmaddr為-1
int shmdt(const void *shmaddr);若要移除已經建立的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);
}