Linux 共享内存详解一
生活随笔
收集整理的這篇文章主要介紹了
Linux 共享内存详解一
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
共享內存段被多個進程附加的時候,如果不是所有進程都已經調用shmdt,那么刪除該共享內存段時,
會出現一個臨時的不完整的共享內存段(key值是0),無法徹底刪除。只有當所有進程都調用shmdt,這個臨時的不完整共享內存段才會消失。 //共享內存 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/ipc.h> #include <sys/shm.h>typedef struct _student {char name[64];int index; }Student;int main() {//創建內存中的共享內存區,大小是sizeof(Student),權限是0666int shmid= shmget(0x2234,sizeof(Student),0666|IPC_CREAT|IPC_EXCL);if(shmid==-1){if(errno==EEXIST){//該key值的共享內存已經存在shmid=shmget(0x2234,sizeof(Student),0666);}else{perror("shmget() err");return -1;}}//創建進程內的映射共享內存區void *buf=NULL;//shmat()第二個參數為NULL,表示由系統創建進程內的共享內存,第三個參數表示的是讀寫權限//返回值buf是系統在本進程內分配的內存塊的首地址buf=shmat(shmid,NULL,0);//向本進程的共享內存寫入數據strcpy(buf,"11112");printf("請輸入操作!\n");char ch=getchar();if(ch=='1'){//將本進程中映射共享內存的內存塊釋放,本進程取消附加共享內存 shmdt(buf);//刪除共享內存段 shmctl(shmid,IPC_RMID,NULL);}return 0; }
會出現一個臨時的不完整的共享內存段(key值是0),無法徹底刪除。只有當所有進程都調用shmdt,這個臨時的不完整共享內存段才會消失。 //共享內存 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/ipc.h> #include <sys/shm.h>typedef struct _student {char name[64];int index; }Student;int main() {//創建內存中的共享內存區,大小是sizeof(Student),權限是0666int shmid= shmget(0x2234,sizeof(Student),0666|IPC_CREAT|IPC_EXCL);if(shmid==-1){if(errno==EEXIST){//該key值的共享內存已經存在shmid=shmget(0x2234,sizeof(Student),0666);}else{perror("shmget() err");return -1;}}//創建進程內的映射共享內存區void *buf=NULL;//shmat()第二個參數為NULL,表示由系統創建進程內的共享內存,第三個參數表示的是讀寫權限//返回值buf是系統在本進程內分配的內存塊的首地址buf=shmat(shmid,NULL,0);//向本進程的共享內存寫入數據strcpy(buf,"11112");printf("請輸入操作!\n");char ch=getchar();if(ch=='1'){//將本進程中映射共享內存的內存塊釋放,本進程取消附加共享內存 shmdt(buf);//刪除共享內存段 shmctl(shmid,IPC_RMID,NULL);}return 0; }
轉載于:https://www.cnblogs.com/zhanggaofeng/p/6224091.html
總結
以上是生活随笔為你收集整理的Linux 共享内存详解一的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Struts01---入门小案例
- 下一篇: Linux bashrc和profile