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微信扫描二维码,关注我的公众号