如何处理 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? 的相关文章

  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 如何计算 pandas 数据帧上的连续有序值

    我试图从给定的数据帧中获取连续 0 值的最大计数 其中包含来自 pandas 数据帧的 id date value 列 如下所示 id date value 354 2019 03 01 0 354 2019 03 02 0 354 201
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2

随机推荐

  • 如何在渲染前获取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进程的通