Linux共享内存通信的C语言Demo代码
重点注明:
本文代码来源于:
https://blog.csdn.net/github_38294679/article/details/122360026
=====================================================
使用python编程时总是会用到共享内存的操作,这个共享内存的操作可以使多个python进程共享数据,而且使用这个共享内存在多进程间访问数据可以达到几乎和访问本进程内存空间下数据一致的速度。对于这个共享内存感觉十分的神奇,但是对其在操作系统中的原理还是不了解,突然看到网上的一个关于共享内存的C代码,搞了下来,发现可以跑通,这里记录下运行的记录。
代码比较简单,一共三个文件,一个是共用的头文件shmdata.h,一个是shm_slave.c,一个是shm_master.c 。
其中,shm_slave.c 和 shm_master.c 都有主函数,编译后为可执行文件shm_slave和shm_master,其中shm_slave向共享空间中写入内容,shm_master从共享空间中读出内容。
shmdata.h
#ifndef _SHMDATA_H_HEADER
#define _SHMDATA_H_HEADER #define TEXT_SZ 2048 struct shared_use_st
{
int written; // 作为一个标志,非0:表示可读,0:表示可写
char text[TEXT_SZ]; // 记录写入 和 读取 的文本
}; #endif
shm_slave.c
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/shm.h>
#include "shmdata.h" int main(int argc, char **argv)
{
void *shm = NULL;
struct shared_use_st *shared = NULL;
char buffer[BUFSIZ + 1]; // 用于保存输入的文本
int shmid; // 创建共享内存
shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);
if (shmid == -1)
{
fprintf(stderr, "shmget failed\n");
exit(EXIT_FAILURE);
} // 将共享内存连接到当前的进程地址空间
shm = shmat(shmid, (void *)0, 0);
if (shm == (void *)-1)
{
fprintf(stderr, "shmat failed\n");
exit(EXIT_FAILURE);
} printf("Memory attched at %X\n", (int)shm); // 设置共享内存
shared = (struct shared_use_st *)shm;
while (1) // 向共享内存中写数据
{
// 数据还没有被读取,则等待数据被读取,不能向共享内存中写入文本
while (shared->written == 1)
{
sleep(1);
printf("Waiting...\n");
} // 向共享内存中写入数据
printf("Enter some text: ");
fgets(buffer, BUFSIZ, stdin);
strncpy(shared->text, buffer, TEXT_SZ); // 写完数据,设置written使共享内存段可读
shared->written = 1; // 输入了end,退出循环(程序)
if (strncmp(buffer, "end", 3) == 0)
{
break;
}
} // 把共享内存从当前进程中分离
if (shmdt(shm) == -1)
{
fprintf(stderr, "shmdt failed\n");
exit(EXIT_FAILURE);
} sleep(2);
exit(EXIT_SUCCESS);
}
shm_master.c
#include <stddef.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "shmdata.h" int main(int argc, char **argv)
{
void *shm = NULL;
struct shared_use_st *shared; // 指向shm
int shmid; // 共享内存标识符
// 将内容写入到文件,可以通过查看文件确定共享内存是否成功
FILE* file = fopen("t.txt","w+"); // 创建共享内存
shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);
if (shmid == -1)
{
fprintf(stderr, "shmat failed\n");
exit(EXIT_FAILURE);
} // 将共享内存连接到当前进程的地址空间
shm = shmat(shmid, 0, 0);
if (shm == (void *)-1)
{
fprintf(stderr, "shmat failed\n");
exit(EXIT_FAILURE);
} printf("\nMemory attached at %X\n", (int)shm); // 设置共享内存
shared = (struct shared_use_st*)shm; // 注意:shm有点类似通过 malloc() 获取到的内存,所以这里需要做个 类型强制转换
shared->written = 0;
while (1) // 读取共享内存中的数据
{
// 没有进程向内存写数据,有数据可读取
if (shared->written == 1)
{
printf("You wrote: %s", shared->text);
fputs(shared->text,file);
fflush(file);
sleep(1); // 读取完数据,设置written使共享内存段可写
shared->written = 0; // 输入了 end,退出循环(程序)
if (strncmp(shared->text, "end", 3) == 0)
{
break;
}
}
else // 有其他进程在写数据,不能读取数据
{
sleep(1);
}
} // 把共享内存从当前进程中分离
if (shmdt(shm) == -1)
{
fprintf(stderr, "shmdt failed\n");
fclose(file);
exit(EXIT_FAILURE);
} // 删除共享内存
if (shmctl(shmid, IPC_RMID, 0) == -1)
{
fprintf(stderr, "shmctl(IPC_RMID) failed\n");
fclose(file);
exit(EXIT_FAILURE);
}
fclose(file);
exit(EXIT_SUCCESS);
}
==========================================
编译命令:
gcc -o shm_slave shm_slave.c
gcc -o shm_master shm_master.c


执行:


========================================
Linux共享内存通信的C语言Demo代码的更多相关文章
- linux 两个进程通过 共享内存 通信例子
例子1:两个进程通过共享内存通信,一个进程向共享内存中写入数据,另一个进程从共享内存中读出数据 文件1 创建进程1,实现功能,打印共享内存中的数据 #include <stdio.h> # ...
- Linux 程序设计1:深入浅出 Linux 共享内存
笔者最近在阅读Aerospike 论文时,发现了Aerospike是利用了Linux 共享内存机制来实现的存储索引快速重建的.这种方式比传统利用索引文件进行快速重启的方式大大提高了效率.(减少了磁盘 ...
- 【转载】ipcs与Linux共享内存
一.共享内存相关知识 所谓共享内存,就是多个进程间共同地使用同一段物理内存空间,它是通过将同一段物理内存映射到不同进程的 虚拟空间来实现的.由于映射到不同进程的虚拟空间中,不同进程可以直接使用,不需要 ...
- linux 共享内存shm_open实现进程间大数据交互
linux 共享内存shm_open实现进程间大数据交互 read.c #include <sys/types.h> #include <sys/stat.h> #includ ...
- Linux共享内存(二)
Linux共享内存编程实例 原文链接:http://blog.csdn.net/pcliuguangtao/article/details/6526119 /*共享内存允许两个或多个进程进程共享同一块 ...
- PHP进程通信基础——信号量+共享内存通信
PHP进程通信基础--信号量+共享内存通信 由于进程之间谁先执行并不确定,这取决于内核的进程调度算法,其中比较复杂.由此有可能多进程在相同的时间内同时访问共享内存,从而造成不可预料的错误.信号量这个名 ...
- Linux 共享内存编程
共享内存允许系统内两个或多个进程共享同一块内存空间,并且数据不用在客户进程和服务器进程间复制,因此共享内存是通信速度最快的一种IPC. 实现的机制简单描述如下:一个进程在系统中申请开辟了一块共享内存空 ...
- Windows进程间共享内存通信实例
Windows进程间共享内存通信实例 抄抄补补整出来 采用内存映射文件实现WIN32进程间的通讯:Windows中的内存映射文件的机制为我们高效地操作文件提供了一种途径,它允许我们在WIN32进程中保 ...
- linux 共享内存
共享内存是最高效的IPC机制,因为它不涉及进程之间的任何数据传输.这种高效带来的问题是,我们必须用其他手段来同步进程对共享内存的访问,否则会产生竞态条件.所以,共享内存通常和其他进程间通信方式一起使用 ...
- linux使用共享内存通信的进程同步退出问题
两个甚至多个进程使用共享内存(shm)通信,总遇到同步问题.这里的“同步问题”不是说进程读写同步问题,这个用信号量就好了.这里的同步问题说的是同步退出问题,到底谁先退出,怎么知道对方退出了.举个例子: ...
随机推荐
- 一个开源且全面的C#算法实战教程
前言 算法在计算机科学和程序设计中扮演着至关重要的角色,如在解决问题.优化效率.决策优化.实现计算机程序.提高可靠性以及促进科学融合等方面具有广泛而深远的影响.今天大姚给大家分享一个开源.免费.全面的 ...
- 三月二十四日 安卓app打卡开发日志
目前打卡系统基本完成 没有实现的功能有无法统计次数 和 连接本地数据库 我全程连接的远程数据库 package com.example.test_four.utils; import java.sql ...
- c++ win32 纤程
Win32纤程是一种轻量级的协程机制,它能够在同一个线程中实现多个线程执行的效果,从而提高了程序的并发性和可伸缩性. 在C++中,可以使用Win32 API中的fiber来实现纤程.以下是一个使用纤程 ...
- Postman 的 Basic Auth 如何通过 Feign 实现
Postman 的 Basic Auth: 分析 根据以上图片分析: Postman 的 Authorization 实际为: header 中添加 Authorization: ******* ** ...
- 半夜被慢查询告警吵醒,limit深度分页的坑
分享是最有效的学习方式. 博客:https://blog.ktdaddy.com/ 故事 梅雨季,闷热的夜,令人窒息,窗外一道道闪电划破漆黑的夜幕,小猫塞着耳机听着恐怖小说,辗转反侧,终于睡意来了,然 ...
- qt中的 connect 函数
1.connect()函数实现的是信号与槽的关联. 注意:只有QO bject类及其派生的类才能使用信号和槽的机制 2.函数原型 static QMetaObject::Connection conn ...
- Java 集合元素排序接口Comparable
什么是Comparable public interface Comparable<T> { /** * Compares this object with the specified o ...
- Linux 文件夹和文件操作【Linux 常用命令系列一】
〇.前言 本文首先介绍了 Linux 中文件的结构,将全部文件夹罗列并介绍了大概的用途: 然后通过实例介绍了文件夹相关的常用操作,仅供参考. 一.Linux 系统的文件结构 列一下系统全部文件夹: / ...
- Known框架实战演练——进销存数据结构
系统主要包含商品信息.商业伙伴(客户.供应商)信息.业务单表头信息.业务单表体信息.对账单表头信息.对账单表体信息. 1. 商品信息(JxGoods) 该表用于存储公司商品信息. 名称 代码 类型 长 ...
- 学习笔记--Java中static关键字
Java中static关键字 static基础用法 什么时候成员变量声明为实例变量 所有对象的这个属性随对象而变化 什么时候成员变量声明为静态变量 所有对象都是这个属性 静态变量在类加载的时候初始化, ...