我在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);
}
答案 0 :(得分:2)
您无法将mmap
传递给execve
- ed可执行文件。
当execve
成功时,整个virtual address space被抓取并重新初始化为执行的ELF二进制文件。这是execve(2)的主要作用之一。在启动时,程序应该期望一个定义良好的内存状态。
也许你可能会采用约定,比如使用一些命名文件,并将该文件的名称作为一些程序参数传递。或传递文件描述符等
(IIRC,有人在多年前提出了一个内核补丁来为mmap(2)
添加一个标记,用于持续execve
的内存映射;该补丁被拒绝了,有充分的理由;我完全忘了细节,可能是非常错误的)
也许你想要shm_overview(7)。或者只是采用具有某个文件名的约定,并将mmap
与MAP_SHARED
一起使用。
请注意,即使您共享(虚拟)内存,也需要一些同步方法。阅读sem_overview(7),futex(7),....
另请阅读ALP和Operating Systems: Three Easy Pieces(均可免费下载)。另请参阅syscalls(2)(有几种方法可以inter-process communication)。