久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

C語(yǔ)言進(jìn)程間通信(四)

 yggzs2002 2017-06-20

共享內(nèi)存通信方式效率最高,,畢竟是直接操作內(nèi)存,,但是要保證多個(gè)進(jìn)程對(duì)同一塊內(nèi)存訪問(wèn)的同步互斥比較麻煩,,借助信號(hào)量實(shí)現(xiàn)

對(duì)每個(gè)共享存儲(chǔ)段,,內(nèi)核維護(hù)一個(gè)shmid_ds類型的結(jié)構(gòu)體,定義在<sys/shm.h>文件中

C代碼  收藏代碼
  1. struct shmid_ds  
  2. {  
  3. struct ipc_perm shm_perm;   //共享內(nèi)存的ipc_perm結(jié)構(gòu)  
  4. size_t shm_segsz;   //共享內(nèi)存區(qū)域大小,,字節(jié)表示  
  5. pid_t shm_lpid; //最后一次調(diào)用shmop函數(shù)的進(jìn)程ID  
  6. pid_t shm_cpid; //創(chuàng)建此共享內(nèi)存的進(jìn)程ID  
  7. unsigned short shm_lkcnt;   //共享內(nèi)存被鎖定的時(shí)間數(shù)  
  8. unsigned long shm_nattch;   //當(dāng)前使用共享內(nèi)存的進(jìn)程數(shù)  
  9. time_t shm_atime;   //最后一次附加操作時(shí)間  
  10. time_t shm_dtime;   //最后一次分離操作時(shí)間  
  11. time_t shm_ctime;   //最后一次修改時(shí)間  
  12. }  

共享內(nèi)存基本操作

1,,創(chuàng)建或打開(kāi)一個(gè)共享內(nèi)存(shmget)

C代碼  收藏代碼
  1. //create_shm.c  
  2. #include<sys/types.h>  
  3. #include<sys/ipc.h>  
  4. #include<sys/shm.h>  
  5. #include<stdio.h>  
  6.   
  7. #define BUFSZ 1024  
  8.   
  9. int main()  
  10. {  
  11.         int shm_id;     //共享內(nèi)存ID  
  12.         shm_id = shmget(IPC_PRIVATE,BUFSZ,0666);  
  13.         if(shm_id < 0){  
  14.                 printf("shmget failed\n");  
  15.                 return -1;  
  16.         }  
  17.         printf("create shared memory succeed: %d\n",shm_id);  
  18.         system("ipcs -m"); //查看共享內(nèi)存ID  
  19.         return 0;  
  20. }  

2,附加共享內(nèi)存到進(jìn)程空間(shmat/shmdt)

C代碼  收藏代碼
  1. //attach_shm.c  
  2. #include<sys/types.h>  
  3. #include<sys/ipc.h>  
  4. #include<sys/shm.h>  
  5. #include<stdio.h>  
  6.   
  7. #define BUFSZ 1024  
  8.   
  9. int main()  
  10. {  
  11.         int *shm;  
  12.         shm = shmat(104529925,NULL,0);  
  13.         if(*shm == -1){  
  14.                 printf("shmat failed\n");  
  15.                 return -1;  
  16.         }  
  17.         printf("attach shared memory succeed: %d\n",*shm);  
  18.         system("ipcs -m"); //查看共享內(nèi)存調(diào)用狀態(tài)   
  19.         if(shmdt(shm) == -1){  
  20.                 printf("shmdt failed\n");  
  21.                 return -1;  
  22.         }  
  23.         system("ipcs -m"); //查看共享內(nèi)存調(diào)用狀態(tài)   
  24.         return 0;  
  25. }  

3,共享內(nèi)存控制函數(shù)(shmctl)

 

下面寫個(gè)簡(jiǎn)單的例子

共享內(nèi)存寫端(write_shm.c)

C代碼  收藏代碼
  1. //write_shm.c  
  2. #include<sys/types.h>  
  3. #include<sys/ipc.h>  
  4. #include<sys/shm.h>  
  5. #include<stdio.h>  
  6.   
  7. typedef struct  
  8. {  
  9.         char name[4];  
  10.         int age;  
  11. }people;  
  12.   
  13. int main()  
  14. {  
  15.         int i;  
  16.         char *t = 'a';  
  17.         people *p_shm = NULL;  
  18.         p_shm = shmat(104529925,NULL,0);  
  19.         if(p_shm == NULL){  
  20.                 printf("shmat failed\n");  
  21.                 return -1;  
  22.         }  
  23.         for(i=0;i<5;i++) {  
  24.                 t += 1;  
  25.                 memcpy((*(p_shm+i)).name,&t,1);  
  26.                 (*(p_shm+i)).age = 20+i;  
  27.         }  
  28.         if(shmdt(p_shm) == -1){  
  29.                 printf("shmdt failed\n");  
  30.                 return -1;  
  31.         }  
  32.         return 0;  
  33. }  

共享內(nèi)存讀端(read_shm.c)

C代碼  收藏代碼
  1. //read_shm.c  
  2. #include<sys/types.h>  
  3. #include<sys/ipc.h>  
  4. #include<sys/shm.h>  
  5. #include<stdio.h>  
  6.   
  7. typedef struct  
  8. {  
  9.         char name[4];  
  10.         int age;  
  11. }people;  
  12.   
  13. int main()  
  14. {  
  15.         int i;  
  16.         char *t = 'a';  
  17.         people *p_shm = NULL;  
  18.         p_shm = shmat(104529925,NULL,0);  
  19.         if(p_shm == NULL){  
  20.                 printf("shmat failed\n");  
  21.                 return -1;  
  22.         }  
  23.         for(i=0;i<5;i++) {  
  24.                 printf("name:%s age:%d\n",(*(p_shm+i)).name,(*(p_shm+i)).age);  
  25.         }  
  26.         if(shmdt(p_shm) == -1){  
  27.                 printf("shmdt failed\n");  
  28.                 return -1;  
  29.         }  
  30.         return 0;  
  31. }  

先后編譯執(zhí)行"寫代碼"與"讀代碼",結(jié)果如下

Txt代碼  收藏代碼
  1. root$ ./write_shm.out   
  2. root$ ./read_shm.out   
  3. name:b age:20  
  4. name:c age:21  
  5. name:d age:22  
  6. name:e age:23  
  7. name:f age:24  

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多