c - 如何使用 POSIX 按进程父进程返回 cJSON 片段?

标签 c posix shared-memory worker cjson

tl;dr:我该如何配置cJSON在子进程中分配内存,以便父进程可以看到结果结构?

<小时/>

我收到一个请求,其中列出了要为其生成摘要并以 JSON 形式返回的多个产品。目前,我的代码是单线程的,并使用 cJSON 库来编写和编码 JSON。

由于摘要的计算成本很高(用户请求将某些计算作为摘要的一部分执行),我想 fork(2)对于每个请求的产品,然后让它获取、处理并汇总为 cJSON_Object(技术上是 cJSON* 但“构造函数”是 cJSON_CreateObject ),然后 have the parent thread wait for all children to return将它们的 cJSON_Object 对象连接在一起,执行一些后处理,然后最终编码为字符串以返回。由于后处理的原因,我想向父级返回一个 cJSON_Object 而不是让子线程返回字符串。

现在,我看到 cJSON.h:144 CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks)它接受 cJSON.h:125 struct internal_hooks它允许您指定自定义 malloc()free() 实现...如果我能找到分配共享内存的版本...并共享,那就太棒了相同类型。我发现的最接近的是 shmalloc/shfree但这是来自 OpenMPI库,对于看起来应该是简单的工作线程来说似乎有点矫枉过正......

现在,这就是我陷入困境的地方如何将 cJSON 结构图从子进程返回到父进程

I've attached the best (albeit untested) solution I've thought of as an answer to not clutter this question further.

PS - 最好的解决方案将自身限制为 POSIX API,但仅 Linux 是可以接受的,附加库是最后的手段。

最佳答案

我还没有测试过这个,它看起来很黑客,但这是我迄今为止想到的最好的:

我确实找到了 shmget(3) 。类型签名不兼容,所以我想我可以包装它。在每个 child 中,我可以生成一个唯一的整数用作 key_t ,并分配足够的内存来容纳响应。然后提供我自己的malloc()它只是从 shmget 分配的 block 中分配。最后返回key_t通过 exit(3) 发送给家长称呼。父线程将获得值 key_t来自 wait(3) ,然后能够获取 cJSON_Object并将其与其他片段结合起来。

所以答案是让 on child 开始:shmget一些内存,然后写一个malloc() -兼容功能my_malloc()分配 shmget ed 内存,并有一个指向 my_malloc() 的指针传递至cJSON_InitHooks通过struct internal_hooks .

关于c - 如何使用 POSIX 按进程父进程返回 cJSON 片段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54424188/

相关文章:

C++ - fork 进程无法从共享内存中读取

从消息队列接收后无法使用shm_open

python - ccTalk 硬币接收器插入硬币时没有反应

c - 如何正确计算 fork 子进程的实际数量?

c - Makefile:扩展依赖项

linux - POSIX 进程间同步

c - 如果在单独的线程中关闭(2) 文件描述符,select(2) 会做什么?

c++ - <函数> 引用自;找不到符号

连接路径和基本名称

c++ - 共享内存中的 pcl::PointCloud