我试图用进程重现MapReduce。我使用shmget()在父进程中分配共享内存,以便每个子进程都可以访问它。这段内存假设存储一个标志和一个信号量。完成第一个子集等待信号量(其初始值为1),设置标志,然后运行reduce方法。因此,当其他子进程发现标志已设置时,它们应该各自退出。我没有得到预期的行为,如果有人可以告诉我下面提供的代码中发生的事情,以及它与我试图完成的内容有何不同,我会很感激。
在sem_init之后检查errno为我提供ENOSYS,根据文档是正确的,因为我将pshared设置为1。
int map_reduce(int num_proc){
int i, pid, id, sem_ret, sem_count;
size_t index, size = 1 + sizeof(sem_t);
key_t key = IPC_PRIVATE;
id = shmget(key, size, IPC_CREAT | SHM_W | SHM_R);
void *addr = shmat(id, NULL, 0);
*((char *)addr) = 0;
sem_t *sem = (sem_t *)((char *)addr + 1);
sem_count = 1;
sem_ret = sem_init(sem, 1, sem_count);
printf("%d \n", errno == ENOSYS); // this is true
for(i = 0; i < num_proc; i++){
pid = fork();
if(pid == 0){
map();
sem_ret = sem_wait(sem);
if(*((char *)addr) == 0){
*((char *)addr) = 1;
reduce();
}
sem_ret = sem_post(sem);
exit(0);
}
}
while(wait(NULL) > 0);
struct shmid_ds buf;
key = shmctl(id, IPC_RMID, &buf);
return 0;
}
这是我通过运行一个只调用map_reduce(5)的实例得到的结果。 map和reduce也可以简单地打印出来。
pid: 19813 mapping
pid: 19814 mapping
pid: 19815 mapping
pid: 19816 mapping
pid: 19814 reducing
pid: 19812 reducing
pid: 19815 reducing
答案 0 :(得分:2)
ENOSYS
表示
The function sem_init() is not supported by this implementation.
和
pshared is nonzero, but the system does not support process-shared semaphores.
换句话说,您的系统不支持共享信号量,因此您无法使用信号量来完成跨越进程边界的尝试。