我可以在 Linux 进程和分叉子进程之间创建共享数据部分吗?

托尼苏

我知道这可能是一个奇怪的要求,但这里是:我必须在我的 x86-64 Linux ELF 可执行文件中创建一个读写部分/段,以便该部分可以在进程及其子进程之间共享。我会处理缓冲区中的任何数据同步要求,所以请不要担心这个麻烦。

我知道mmap可以将“共享”页面映射到我的进程中,但由于某种原因,我不能使用mmap或类似的功能。我能做的是使用一个大char数组。到目前为止,我不知道这是否是一项不可能完成的任务。

这是我的测试代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>

// reserve 20M bytes as JIT buffer
#define BUF_SIZE 20*1024*1024
char jit_buffer[BUF_SIZE] __attribute__((section(".buffer"), aligned(4096)));

int main()
{
    printf("pid=%d\n\n", getpid());
    printf(".main Start Address: %p\n", &main);
    printf(".buffer Start Address: %p\n", jit_buffer);

    getchar();
    return 0;
}
gcc -o bssmap bssmap.c

执行后,我可以查看 .buffer 部分,但发现它是私有的,我不知道是否以及如何使其共享

$ ./bssmap 
pid=557836

.text Start Address: 0x564e9637f189
.buffer Start Address: 0x564e96383000

在另一个终端

$ cat /proc/557836/maps
564e9637e000-564e9637f000 r--p 00000000 08:02 7213494  bssmap
564e9637f000-564e96380000 r-xp 00001000 08:02 7213494  bssmap
564e96380000-564e96381000 r--p 00002000 08:02 7213494  bssmap
564e96381000-564e96382000 r--p 00002000 08:02 7213494  bssmap
564e96382000-564e97783000 rw-p 00003000 08:02 7213494  bssmap <-- 'private' but want 'shared'

顺便说一句,我知道 GCC 手册中有一个“共享”属性,但它适用于 Windows,在 Linux 中编译时会被忽略并发出警告。

受雇俄罗斯人

我知道 mmap 可以将“共享”页面映射到我的进程中

是的,使用mmap. 其他可能的答案:POSIX 共享内存(shm_open和朋友)和 SysV IPC(shmat和朋友)。

但由于某种原因,我不能使用 mmap 或类似功能。

您最好弄清楚“某种原因”是什么,因为您刚刚禁止了可行的解决方案

我能做的是使用一个大字符数组。到目前为止,我不知道这是否是一项不可能完成的任务。

那是行不通的。您目前只能共享“大字符数组” fork()一旦你有两个独立的进程,就不可能通过这个数组进行进一步的通信。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

可以在父进程和子进程之间共享dict吗?

为什么在Linux API和Bash中管道可以使用的进程之间的关系不同

可以在Python进程之间共享set()吗?

我可以告诉Linux不要换出特定进程的内存吗?

在Linux上的进程之间共享内存

可以在两个单独的进程之间共享内存中的数据吗?

是否可以在同一父级(LINUX,POSIX)创建的两个子进程之间建立管道

我可以从VHD引导Linux吗?

我可以从 Linux 写入 NTFS 系统吗?

我可以在两个进程之间共享内存而没有任何通过吗?(在Android NDK中)

我可以在Linux上与另一个进程共享文件描述符,还是在该进程本地?

我们可以使用c在linux中创建进程的几种方法

向C / Linux中的分叉子进程发出信号

可以在Linux中暂时冻结进程吗?

我可以在Node.js进程之间高效地传输Tensorflow.js Tensor吗?

我可以在多个Linux发行版之间共享/ usr / local吗?

Linux中进程和线程之间的区别

我可以阅读Linux内核的哪些部分以取乐?

我可以在Linux小狗上进行编程吗?

我可以从同一HDD安装Linux吗?

我可以从Linux Shell连接到Windows机器吗?

我可以在Android平板电脑上运行Linux吗?

在GNU-Prolog中,我可以“捕获” Linux信号吗?

我可以在Perfect上使用Linux上的Realm吗?

我可以在Linux Docker容器中运行JetBrains dotCover吗?

我可以用模块替换Linux内核功能吗?

我可以在Linux中执行写时复制memcpy吗?

我可以更改Docker在macOS上使用的Linux内核吗?

我可以在 Linux 中使用 Badboy 软件吗?