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

时间:2017-11-05 17:36:47

标签: c pointers shared-memory mmap

我在Linux中编码并尝试通过执行另一个程序来完成某项任务。

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

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

如果我使用信号量进行同步,我还需要传递共享信号量的mmap。调用者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);
}

1 个答案:

答案 0 :(得分:2)

您无法将mmap传递给execve - ed可执行文件。

execve成功时,整个virtual address space被抓取并重新初始化为执行的ELF二进制文件。这是execve(2)的主要作用之一。在启动时,程序应该期望一个定义良好的内存状态。

也许你可能会采用约定,比如使用一些命名文件,并将该文件的名称作为一些程序参数传递。或传递文件描述符等

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

也许你想要shm_overview(7)。或者只是采用具有某个文件名的约定,并将mmapMAP_SHARED一起使用。

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

另请阅读ALPOperating Systems: Three Easy Pieces(均可免费下载)。另请参阅syscalls(2)(有几种方法可以inter-process communication)。