9

我在让信号量在基于 Linux 的 C 系统上工作时遇到了很多困难。

我的申请流程是这样的:

  1. 申请开始
  2. 申请分叉到孩子/父母
  3. 每个进程使用sem_open一个通用名称来打开信号量。

如果我在分叉之前创建信号量,它工作正常。但是,要求阻止我这样做。当我第二次尝试调用sem_open时,我收到“Permission Denied”错误(通过errno)。

有可能以任何方式做到这一点吗?或者有什么办法可以在一个进程中打开信号量,并使用共享内存机制与子进程共享?

4

2 回答 2

10

在标志中使用 O_CREAT 时不要忘记指定模式和值参数。这是一个工作示例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/wait.h>

static void parent(void)
{
    sem_t * sem_id;
    sem_id=sem_open("mysem", O_CREAT, 0600, 0);
    if(sem_id == SEM_FAILED) {
        perror("parent sem_open");
        return;
    }
    printf("waiting for child\n");
    if(sem_wait(sem_id) < 0) {
        perror("sem_wait");
    }
}

static void child(void)
{
    sem_t * sem_id;
    sem_id=sem_open("mysem", O_CREAT, 0600, 0);
    if(sem_id == SEM_FAILED) {
        perror("child sem_open");
        return;
    }
    printf("Posting for parent\n");
    if(sem_post(sem_id) < 0) {
        perror("sem_post");
    }
}

int main(int argc, char *argv[])
{
    pid_t pid;
    pid=fork();
    if(pid < 0) {
        perror("fork");
        exit(EXIT_FAILURE);
    }

    if(!pid) {
        child();    
    } else {
        int status;
        parent();
        wait(&status);
    }
    return 0;
}
于 2010-02-19T14:45:09.647 回答
8

您使用的是 sem_open 的 4 参数还是 2 参数版本?

确保使用 4 参数版本并使用允许其他进程打开信号量的模式。假设所有进程都属于同一用户,则 0600 ( S_IRUSR | S_IWUSR) 模式就足够了。

您可能还想验证您的 umask 是否没有屏蔽任何必要的权限。

于 2010-02-19T07:34:56.783 回答