C:sem_open上的“无此类文件或目录”,带有O_CREAT和正确的信号灯名称

时间:2018-07-07 15:47:53

标签: c linux semaphore

我正在尝试像这样在C的init函数中创建信号灯:

void sem_init(int size, sem_t** sem1, sem_t** sem2) {
  char* semname1 = "/somename";
  char* semname2 = "/someothername";

  errno = 0;
  *sem1 = sem_open(semname1, O_CREAT, S_IRUSR|S_IWUSR, 0);
  printf(strerror(errno));

  errno = 0;
  *sem2 = sem_open(semname2, O_CREAT, S_IRUSR|S_IWUSR, size);
  printf(strerror(errno));
}

但是,即使我设置为O_CREAT标志并且名称格式正确,我始终会得到“无此类文件或目录”作为输出。信号灯在/ dev / shm /...

中创建

我看不出发生此错误的任何明显原因。请帮我解决我做错的事情。

谢谢您的帮助。

1 个答案:

答案 0 :(得分:3)

正如对OP问题的注释所表明的,正在使用errno中不正确的值。建议:

void sem_init(int size, sem_t** sem1, sem_t** sem2) {
    char* semname1 = "/somename";
    char* semname2 = "/someothername";
    sem_t local_sem1;
    sem_t local_sem2;

    if( (local_sem1 = sem_open(semname1, O_CREAT, S_IRUSR|S_IWUSR, 0) ) == SEM_FAILED )
    {
        perror( "sem_open for sem1 failed" );
        exit( EXIT_FAILURE );
    }

    *sem1 = local_sem1;

    if( (local_sem2 = sem_open(semname2, O_CREAT, S_IRUSR|S_IWUSR, 0) ) == SEM_FAILED )
    {
        perror( "sem_open doe awm2 failed" );
        exit( EXIT_FAILURE );
    }

    *sem2 = local_sem2;
}