如何处理 C 和 Python 之间的 IPC?

2024-01-16

我有一个具有两个进程的应用程序,一个在 C 中,一个在 Python 中。 C 进程是完成所有繁重工作的地方,而 Python 进程则处理用户界面。

C 程序每秒向大型缓冲区写入 4 次,Python 进程读取该数据。至此与Python进程的通信已经由AMQP完成。我宁愿在两个进程之间设置一些内存共享,以减少开销并提高性能。

我在这里有什么选择?理想情况下,我只是让 Python 进程直接读取物理内存(最好是从内存而不是从磁盘),然后使用信号量或类似的东西来处理竞争条件。然而,这是我几乎没有经验的事情,所以我会很感激我能得到的任何帮助。

顺便说一句,我正在使用 Linux。


这个问题已经被问了很长时间了。我相信提问者已经有了答案,所以我写下这个答案,供后来的人参考。

/*C code*/

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define GETEKYDIR ("/tmp")
#define PROJECTID  (2333)
#define SHMSIZE (1024)

void err_exit(char *buf) {
    fprintf(stderr, "%s\n", buf);
    exit(1);
}


    int
main(int argc, char **argv)
{

    key_t key = ftok(GETEKYDIR, PROJECTID);
    if ( key < 0 )
        err_exit("ftok error");

    int shmid;
    shmid = shmget(key, SHMSIZE, IPC_CREAT | IPC_EXCL | 0664);
    if ( shmid == -1 ) {
        if ( errno == EEXIST ) {
            printf("shared memeory already exist\n");
            shmid = shmget(key ,0, 0);
            printf("reference shmid = %d\n", shmid);
        } else {
            perror("errno");
            err_exit("shmget error");
        }
    }

    char *addr;

    /* Do not to specific the address to attach
     * and attach for read & write*/
    if ( (addr = shmat(shmid, 0, 0) ) == (void*)-1) {
        if (shmctl(shmid, IPC_RMID, NULL) == -1)
            err_exit("shmctl error");
        else {
            printf("Attach shared memory failed\n");
            printf("remove shared memory identifier successful\n");
        }

        err_exit("shmat error");
    }

    strcpy( addr, "Shared memory test\n" );

    printf("Enter to exit");
    getchar();

    if ( shmdt(addr) < 0) 
        err_exit("shmdt error");

    if (shmctl(shmid, IPC_RMID, NULL) == -1)
        err_exit("shmctl error");
    else {
        printf("Finally\n");
        printf("remove shared memory identifier successful\n");
    }

    return 0;
}
#python 

# Install sysv_ipc module firstly if you don't have this
import sysv_ipc as ipc

def main():
    path = "/tmp"
    key = ipc.ftok(path, 2333)
    shm = ipc.SharedMemory(key, 0, 0)

    #I found if we do not attach ourselves
    #it will attach as ReadOnly.
    shm.attach(0,0)  
    buf = shm.read(19)
    print(buf)
    shm.detach()
    pass

if __name__ == '__main__':
    main()

C程序需要首先执行,不要在Python代码执行之前停止它,它会创建共享内存段并向其中写入内容。然后Python代码附加相同的段并从中读取数据。

完成所有操作后,按 Enter 键停止 C 程序并删除共享内存 ID。

我们可以在这里看到有关 python SharedMemory 的更多信息:http://semanchuk.com/philip/sysv_ipc/#shared_memory http://semanchuk.com/philip/sysv_ipc/#shared_memory

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理 C 和 Python 之间的 IPC? 的相关文章

  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • Python:XML 内所有标签名称中的字符串替换(将连字符替换为下划线)

    我有一个格式不太好的 XML 标签名称内有连字符 我想用下划线替换它 以便能够与 lxml objectify 一起使用 我想替换所有标签名称 包括嵌套的子标签 示例 XML
  • 如何解决 PDFBox 没有 unicode 映射错误?

    我有一个现有的 PDF 文件 我想使用 python 脚本将其转换为 Excel 文件 目前正在使用PDFBox 但是存在多个类似以下错误 org apache pdfbox pdmodel font PDType0Font toUnico
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 使用for循环时如何获取前一个元素? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 循环内的上一个和下一个值 https stackoverflow com questions 1011938 python previous and next values inside
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • 更改 Tk 标签小部件中单个单词的颜色

    我想更改 Tkinter 标签小部件中单个单词的字体颜色 我知道可以使用文本小部件来实现与我想要完成的类似的事情 例如使单词 YELLOW 显示为黄色 self text tag config tag yel fg clr yellow s
  • 使用 z = f(x, y) 形式的 B 样条方法来拟合 z = f(x)

    作为一个潜在的解决方案这个问题 https stackoverflow com questions 76476327 how to avoid creating many binary switching variables in gekk
  • Kivy - 单击按钮时编辑标签

    我希望 Button1 在单击时编辑标签 etykietka 但我不知道如何操作 你有什么想法吗 class Zastepstwa App def build self lista WebOps getList layout BoxLayo
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • 如何在渲染前获取textview的行数?

    如何获取字符串在 a 中占用的行数TextView在渲染之前 A ViewTreeObserver不起作用 因为它们仅在渲染后才会被触发 当将整个单词放在下一行以避免破坏单词时 接受的答案不起作用 hello world 100 确定行数的
  • Google Play 商店正在向用户提供额外积分? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我们正在使用服务器端验证来验证 Play 商店中的应用内订阅 谷歌针对其中一个请求返回了这样的响应 kind androidpublisher sub
  • 处理大量rtsp摄像头,无实时限制

    问题定义 假设我有大量 rtsp 摄像机 gt 100 我想对其执行一些操作 例如图像特征提取 重要提示 我对实时性能不感兴趣 我什至可以在一分钟内进行 4 次特征提取 显然 越多越好 As now 瓶颈是图像采集 帧是通过以下方式获取的c
  • iOS WebView远程html与本地图像文件

    以前也有人问过类似的问题 但我一直找不到解决方案 这是我的情况 我的 UIWebView 加载远程 html 页面 网页中使用的图像在构建时是已知的 为了使页面加载速度更快 我想将iOS应用程序中的图像文件打包并在运行时替换它们 请注意 h
  • 如何修复错误:(psycopg2.errors.NotNullViolation)“id”列中的空值违反非空约束?

    为什么会出现下面的错误 我知道db session add 方法但是我想使用原始 SQL 来学习 UUID 不应该自动生成吗 也许我在 postgresql 文本中遗漏了一些内容或者模型中的 id 不正确 error Error psyco
  • 如何配置概率占用地图人员检测器

    概率占用图是一种多摄像头人体检测程序 其c 免费实施可在以下位置获取 http cvlab epfl ch software pom http cvlab epfl ch software pom 为了利用这个方便的软件 需要 经过背景去除
  • 如何比较两个文件的创建日期?

    使用 XP 的批处理 如何使用返回 true 或 false 的函数 isMoreRecentThan pathToFile1 pathToFile2 来比较两个文件的创建日期 该解决方案应在没有管理员权限的情况下运行 特别是不应使用 wm
  • 将 Array Of String 转换为 Double,然后在 Swift 中计算总和

    我有一个字符串数组 我想将其转换为双精度 然后我想将数组中的每个项目加在一起并得到总和 到目前为止 这是我的代码 枚举数组后 我在将它们全部添加在一起时遇到问题 update Xcode 10 1 Swift 4 2 1 或更高版本 let
  • 为什么事件上的composedPath在延迟时返回不同的值?

    因为简单来说path不存在于MouseEvent or WheelEvent类型 我正在使用替代方案 composedPath方法 直到现在我还无法体验到它们之间的区别 我包裹了我的wheel听众与requestAnimationFrame
  • 使用 Apache2 在 Ubuntu 12.04 上启用 htaccess 错误

    我尝试启用 htaccess 我变了
  • 找出当前选择的是哪个 gtk 小部件

    我有一个收藏GtkEntry小部件 其中一些是可编辑和可聚焦的 而另一些则不是 我想找出其中哪些 如果有 当前选择了文本 以便实现 编辑 gt 复制 菜单项 除了迭代所有小部件直到gtk editable get selection bou
  • 删除 iOS Swift 发布版本的 println()

    我想全局忽略所有println 如果我不在调试版本中 则调用我的 Swift 代码 我找不到任何可靠的分步说明 希望得到指导 有没有办法在全球范围内做到这一点 或者我需要包围每个println with IF DEBUG ENDIF声明 最
  • 为什么二进制序列化比 xml 序列化更快?

    为什么二进制序列化比 xml 序列化更快 考虑序列化双精度 例如 二进制序列化 将内存地址中的 8 个字节写入流中 二进制反序列化 读取相同的8个字节 xml 序列化 写入标记 转换为文本 写入结束标记 I O 增加近三倍 CPU 利用率增
  • 使用 localToScene(x,y) 获取节点场景中的位置返回错误值

    我想将弹出的窗格的位置绑定到调用它的按钮的位置 我尝试通过调用来这样做button localToScene button getLayoutX button getLayoutY 然而 返回的 Point2D 变量中的 X 坐标错误 我在
  • 如何在scala中返回一个函数

    How can I return a function side effecting lexical closure https stackoverflow com questions 22288329 side effecting lex
  • 空文本框上的 JQuery 默认文本

    我有一个电子邮件表单文本框 虽然它是空的 但我希望它具有值 电子邮件 当您单击它时 文本就会消失 如果有人点击它但没有输入文本 关于模糊 我希望它恢复为默认文本 我一直在尝试一些事情 但没有任何效果 有人可以指出我正确的方向吗 或者你可以只
  • Linux中如何从另一个终端访问一个终端上运行的进程?

    我想知道该过程 以便我可以从终端访问或控制 Linux 中其他终端上运行的进程 两个终端属于同一系统 也许你想要类似的东西reptyr https github com nelhage reptyr https github com nel
  • GoCQL:将字符串编组到时间戳中

    我正在开发一个带有聚类列的时间序列数据模型 即 CREATE TABLE events id text time timestamp type text val double PRIMARY KEY id time WITH CLUSTER
  • HttpWebRequest 似乎没有发送客户端 SSL 证书

    我正在尝试使用HttpWebRequest查询运行 nginx 的远程服务器 我需要提供客户端证书才能完成连接 我正在执行以下操作 Dim Request As HttpWebRequest DirectCast WebRequest Cr
  • 如何处理 C 和 Python 之间的 IPC?

    我有一个具有两个进程的应用程序 一个在 C 中 一个在 Python 中 C 进程是完成所有繁重工作的地方 而 Python 进程则处理用户界面 C 程序每秒向大型缓冲区写入 4 次 Python 进程读取该数据 至此与Python进程的通