2016年8月3日 星期三

linux share memory用法

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);
  • 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);
}

沒有留言:

張貼留言