Linux应用编程之共享内存实例
1共享內(nèi)存實(shí)例
01
主要內(nèi)容?? ?
上一小節(jié)小哥跟大家介紹了一下共享內(nèi)存的知識,今天主要是做一個(gè)實(shí)戰(zhàn)的演示,從而更好的理解共享內(nèi)存的原理和實(shí)際應(yīng)用。
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
實(shí)驗(yàn)現(xiàn)象? ?
04
程序解讀? ?
以上提供的共享內(nèi)存實(shí)例比較簡單,不過可以非常好的理解共享內(nèi)存。首先使用shmget創(chuàng)建一塊共享內(nèi)存,然后通過fork命令創(chuàng)建一個(gè)子進(jìn)程,其中父子進(jìn)程都通過shmat完成用戶空間與共享內(nèi)存的映射,從而分別獲得對應(yīng)的指針Send_addr和Recv_addr。
父進(jìn)程通過使用Send_addr內(nèi)存指針,把程序命令行參數(shù)寫入到內(nèi)存中,而子進(jìn)程通過Recv_addr內(nèi)存指針進(jìn)行訪問獲得父進(jìn)程向共享內(nèi)存中寫入的參數(shù)"1024-4096"字符串。
然而使用fork創(chuàng)建進(jìn)程返回后其父子進(jìn)程執(zhí)行是無序的,同時(shí)訪問共享內(nèi)存的非原子性,所以子進(jìn)程通過使用sleep(1)延時(shí)來使得父子進(jìn)程任務(wù)錯(cuò)開訪問共享內(nèi)存。
2最后
這里小哥就介紹了使用共享內(nèi)存的一些知識點(diǎn),?希望能夠?qū)δ阌袔椭?#xff0c;今天就分享到這里,下期精彩見!
推薦閱讀: 專輯|Linux文章匯總專輯|程序人生專輯|C語言我的知識小密圈 關(guān)注公眾號,后臺回復(fù)「1024」獲取學(xué)習(xí)資料網(wǎng)盤鏈接。 歡迎點(diǎn)贊,關(guān)注,轉(zhuǎn)發(fā),在看,您的每一次鼓勵,我都將銘記于心~ 嵌入式Linux微信掃描二維碼,關(guān)注我的公眾號總結(jié)
以上是生活随笔為你收集整理的Linux应用编程之共享内存实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教你精确计算 I2C 上拉电阻阻值
- 下一篇: 整理一篇Linux drm显示系统的文章