C:“;没有这样的文件或目录;使用O_create和适当的信号量名称打开sem_
我尝试在C中的init函数中创建信号量,如下所示: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));
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。