如何将 mmap 传递给 C 中的 execve 函数?

How to pass mmap to execve function in C?

我正在 Linux 编写代码并尝试通过执行另一个程序来完成一些任务。

master 必须执行 slaves 以对某些输入文件进行一些单词搜索(每个 slave 1 个文件)。 完成所有搜索后,master 会将 slave 进程找到的匹配行写入输出文件。我正在尝试使用命名共享内存在主从之间进行通信。

我需要将主控程序中的 mmap 调用指针传递给另一个程序并将其放入其中,但我不能,因为它的类型不匹配。

如果我使用信号量进行同步,我还需要传递共享信号量的mmap。下面是来自调用者 main 的代码片段,用于执行从属程序。我可以通过在 slaves 的 main 中使用 argv 来访问 newArgv:

int f = open(argv[1], O_RDWR);

unsigned int *addr = mmap(0, 10000, PROT_READ | PROT_WRITE, MAP_SHARED, f, 0);

char * newArgv[10];
for (int a = 0; a < numberOfFiles; a++) {
    newArgv[0] = wordToSearch;
    newArgv[1] = argv[3 + a];
    char * path = "./psearch2aslave";
    execve(path, newArgv, NULL);
}

您不能将 mmap 传递给 execve 编辑的可执行文件。

execve成功时,整个virtual address space is scraped and reinitialized for the executed ELF binary. That is one of the main roles of execve(2)。在启动时,程序应该期望一个明确定义的内存状态。

也许您可以采用约定,比如使用某个命名文件,并将该文件的名称作为某个程序参数传递。或者传递文件描述符等

(IIRC,很多年前有人提出了一个内核补丁,为 mmap(2) 添加一个标志,以便内存映射在 execve 中持久存在;那个补丁被拒绝了,有充分的理由; 我完全忘记了细节,可能是非常错误的)

也许你想要 shm_overview(7)。或者只是采用一些文件名的约定并使用 mmapMAP_SHARED.

请注意,即使共享(虚拟)内存,也需要一些同步方法。阅读 sem_overview(7), futex(7), ....

另请阅读 ALP and Operating Systems: Three Easy Pieces (both freely downloadable). See also syscalls(2) (there are several ways to do inter-process communication)。