linux 共享内存shm_open实现进程间大数据交互

/*
int shm_open(const char *name, int oflag, mode_t mode);
//创建或打开一个共享内存,成功返回一个整数的文件描述符,错误返回-1。
1.name:共享内存区的名字;
2.标志位;open的标志一样
3.权限位
int shm_unlink(const char *name);

编译时要加库文件-lrt
*/

标签: <无>

代码片段(2)[全屏查看所有代码]

1. [文件] read.c ~ 1KB     下载(87)     跳至 [1] [2] [全屏预览]

01 #include <sys/types.h>
02 #include <sys/stat.h>
03 #include <fcntl.h>
04 #include <stdio.h>
05 #include <sys/mman.h>
06 #include <string.h>
07 #include <errno.h>
08 #include <unistd.h>
09  
10 /*
11 int shm_open(const char *name, int oflag, mode_t mode);
12 //创建或打开一个共享内存,成功返回一个整数的文件描述符,错误返回-1。
13 1.name:共享内存区的名字;
14 2.标志位;open的标志一样
15 3.权限位
16 int shm_unlink(const char *name);
17  
18 编译时要加库文件-lrt
19 */
20  
21 #define SHMNAME "shm_ram"
22 #define OPEN_FLAG O_RDWR|O_CREAT
23 #define OPEN_MODE 00777
24 #define FILE_SIZE 4096*4
25  
26  
27 int main(void)
28 {
29     int ret = -1;
30     int fd = -1;
31  
32     char buf[4096] = {0};
33     void* add_r = NULL;
34  
35     //创建或者打开一个共享内存
36     fd = shm_open(SHMNAME, OPEN_FLAG, OPEN_MODE);
37     if(-1 == (ret = fd))
38     {
39         perror("shm  failed: ");
40         goto _OUT;
41     }
42      
43         //调整确定文件共享内存的空间
44     ret = ftruncate(fd, FILE_SIZE);
45     if(-1 == ret)
46     {
47         perror("ftruncate faile: ");
48         goto _OUT;
49     }
50      
51     //映射目标文件的存储区
52     add_r = mmap(NULL, FILE_SIZE, PROT_READ, MAP_SHARED, fd, SEEK_SET);
53     if(NULL == add_r)
54     {
55         perror("mmap add_r failed: ");
56         goto _OUT;
57     }
58  
59  
60  
61     //memcpy 内存共享 写入内容
62     memcpy(buf, add_r, sizeof(buf));
63      
64     printf("buf = %s\n", buf);
65  
66     //取消映射
67     ret = munmap(add_r, FILE_SIZE);
68     if(-1 == ret)
69     {
70         perror("munmap add_r faile: ");
71         goto _OUT;
72     }
73     //删除内存共享
74     shm_unlink(SHMNAME);
75     if(-1 == ret)
76     {
77         perror("shm_unlink faile: ");
78         goto _OUT;
79     }
80  
81 _OUT:  
82     return ret;
83 }

2. [文件] write.c ~ 1KB     下载(62)     

01 #include <sys/types.h>
02 #include <sys/stat.h>
03 #include <fcntl.h>
04 #include <stdio.h>
05 #include <sys/mman.h>
06 #include <string.h>
07 #include <errno.h>
08 #include <unistd.h>
09  
10 /*
11 int shm_open(const char *name, int oflag, mode_t mode);
12 //创建或打开一个共享内存,成功返回一个整数的文件描述符,错误返回-1。
13 1.name:共享内存区的名字;
14 2.标志位;open的标志一样
15 3.权限位
16 int shm_unlink(const char *name);
17  
18 编译时要加库文件-lrt
19 */
20  
21 #define SHMNAME "shm_ram"
22 #define OPEN_FLAG O_RDWR|O_CREAT
23 #define OPEN_MODE 00777
24 #define FILE_SIZE 4096*4
25  
26  
27 int main(void)
28 {
29     int ret = -1;
30     int fd = -1;
31  
32     void* add_w = NULL;
33  
34     //创建或者打开一个共享内存
35     fd = shm_open(SHMNAME, OPEN_FLAG, OPEN_MODE);
36     if(-1 == (ret = fd))
37     {
38         perror("shm  failed: ");
39         goto _OUT;
40     }
41      
42      
43     //调整确定文件共享内存的空间
44     ret = ftruncate(fd, FILE_SIZE);
45     if(-1 == ret)
46     {
47         perror("ftruncate faile: ");
48         goto _OUT;
49     }
50      
51     //映射目标文件的存储区
52     add_w = mmap(NULL, FILE_SIZE, PROT_WRITE, MAP_SHARED, fd, SEEK_SET);
53     if(NULL == add_w)
54     {
55         perror("mmap src failed: ");
56         goto _OUT;
57     }
58  
59  
60     //memcpy 内存共享 写入内容
61     memcpy(add_w, "howaylee"sizeof("howaylee"));
62  
63     //取消映射
64     ret = munmap(add_w, FILE_SIZE);
65     if(-1 == ret)
66     {
67         perror("munmap add_w faile: ");
68         goto _OUT;
69     }
70     //删除内存共享
71     /*shm_unlink(SHMNAME);
72     if(-1 == ret)
73     {
74         perror("shm_unlink faile: ");
75         goto _OUT;
76     }*/
77  
78 _OUT:  
79     return ret;
80 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值