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 ,'',1024);
36        printf("Send string:%sn",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: %sn",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微信扫描二维码,关注我的公众号

Published by

风君子

独自遨游何稽首 揭天掀地慰生平