繁体   English   中英

如何通过子进程之间的共享内存共享信号量?

[英]How do I share a semaphore through shared memory between child processes?

我正在尝试使用流程重现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)的实例获得的结果。 还要映射并减少简单地打印出的PID。

pid: 19813 mapping
pid: 19814 mapping
pid: 19815 mapping
pid: 19816 mapping
pid: 19814 reducing
pid: 19812 reducing
pid: 19815 reducing

ENOSYS意思是

The function sem_init() is not supported by this implementation.

pshared is nonzero, but the system does not support process-shared semaphores.

换句话说,您的系统不支持共享信号量,因此您不能使用信号量来完成跨进程边界的尝试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM