我正在尝试像这样在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 /...
中创建我看不出发生此错误的任何明显原因。请帮我解决我做错的事情。
谢谢您的帮助。
答案 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;
}