Linux应用编程之共享内存实例
生活随笔
收集整理的這篇文章主要介紹了
Linux应用编程之共享内存实例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1共享內存實例
01
主要內容?? ?
上一小節小哥跟大家介紹了一下共享內存的知識,今天主要是做一個實戰的演示,從而更好的理解共享內存的原理和實際應用。
02
程序示例? ?
1#include?<stdlib.h>2#include?<stdio.h>3#include?<string.h>4#include?<errno.h>5#include?<unistd.h>6#include?<sys/stat.h>7#include?<sys/types.h>8#include?<sys/ipc.h>9#include?<sys/shm.h> 10 11 12int?main(int?argc,char?**argv) 13{ 14????int?shmid; 15????char?*Send_addr?=?NULL; 16????char?*Recv_addr?=?NULL; 17 18????if(argc?!=?2) 19????{ 20????????printf("Param?Number?over!\n"); 21????????exit(1); 22????} 23 24 25????if((shmid=shmget(IPC_PRIVATE,1024,S_IRUSR|S_IWUSR))==-1) 26????{ 27????????printf("create?share?memory?Fail!\n"); 28????????exit(1); 29????} 30 31 32????if(fork())? 33????{ 34????????Send_addr?=?shmat(shmid,0,0); 35????????memset(Send_addr?,'\0',1024); 36????????printf("Send?string:%s\n",argv[1]); 37????????strncpy(Send_addr?,argv[1],strlen(argv[1])); 38????????wait(NULL); 39????????exit(0); 40????} 41????else????? 42????{ 43????????sleep(1);//?syn?? 44????????Recv_addr?=?shmat(shmid,0,0); 45????????printf("Receive?string:?%s\n",Recv_addr); 46????????exit(0); 47????} 48}03
實驗現象? ?
04
程序解讀? ?
以上提供的共享內存實例比較簡單,不過可以非常好的理解共享內存。首先使用shmget創建一塊共享內存,然后通過fork命令創建一個子進程,其中父子進程都通過shmat完成用戶空間與共享內存的映射,從而分別獲得對應的指針Send_addr和Recv_addr。
父進程通過使用Send_addr內存指針,把程序命令行參數寫入到內存中,而子進程通過Recv_addr內存指針進行訪問獲得父進程向共享內存中寫入的參數"1024-4096"字符串。
然而使用fork創建進程返回后其父子進程執行是無序的,同時訪問共享內存的非原子性,所以子進程通過使用sleep(1)延時來使得父子進程任務錯開訪問共享內存。
2最后
這里小哥就介紹了使用共享內存的一些知識點,?希望能夠對你有幫助,今天就分享到這里,下期精彩見!
推薦閱讀: 專輯|Linux文章匯總專輯|程序人生專輯|C語言我的知識小密圈 關注公眾號,后臺回復「1024」獲取學習資料網盤鏈接。 歡迎點贊,關注,轉發,在看,您的每一次鼓勵,我都將銘記于心~ 嵌入式Linux微信掃描二維碼,關注我的公眾號總結
以上是生活随笔為你收集整理的Linux应用编程之共享内存实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教你精确计算 I2C 上拉电阻阻值
- 下一篇: ARM-汇编指令集