Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:“;没有这样的文件或目录;使用O_create和适当的信号量名称打开sem__C_Linux_Semaphore - Fatal编程技术网

C:“;没有这样的文件或目录;使用O_create和适当的信号量名称打开sem_

C:“;没有这样的文件或目录;使用O_create和适当的信号量名称打开sem_,c,linux,semaphore,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));

我尝试在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/…处创建

我看不出发生错误的任何明显原因。请帮我找出我做错了什么


提前感谢您的帮助。

正如对OPs问题的评论所指出的那样,
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;
}

正如对OPs问题的评论所指出的,正在使用
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;
}

您没有检查是否发生错误,只是打印
errno
的最后一个值。是否实际创建了sem文件?对于大多数系统调用(几乎所有调用),
errno
的值未定义,除非实际存在错误。你必须先检查。这些应该是答案,而不是注释。在我这样检查的真实代码中:如果(errno==0 | | sem1==SEM_失败)如果我只检查SEM_失败,它实际上是有效的,thx<代码>如果(0>(*sem=sem_open(…))或(“发生错误”)。阅读手册页。sem_open在出错时返回-1。您没有检查是否发生错误,只是打印
errno
的最后一个值。是否实际创建了sem文件?对于大多数系统调用(几乎所有调用),
errno
的值未定义,除非实际存在错误。你必须先检查。这些应该是答案,而不是注释。在我这样检查的真实代码中:如果(errno==0 | | sem1==SEM_失败)如果我只检查SEM_失败,它实际上是有效的,thx<代码>如果(0>(*sem=sem_open(…))或(“发生错误”)。阅读手册页。sem_open错误时返回-1。