我正在尝试编写一个简单的信号量程序,并在OSX中发现了几个不同的东西。我使用Mountain Lion和最新的Xcode版本。忘记了语法错误,缺少大括号..因为我有更多的代码,没有复制完整的代码片段,
基本上我除了用sem_wait停止的代码而不是超越。
代码编译和输出如下
Output:
-------
Semaphore wait failed with ret code: -1, and err: 9.
Semaphore init failed with ret code: -1, and err: 9.
追溯到错误代码9,它是EBADF
我的节目是
int main(int argc, char * argv[])
{
pthread_t tid1, tid2;
int rc;
rc = sem_unlink(&mutex);
rc = sem_open(&mutex, O_CREAT,O_RDWR,0);
rc = sem_wait(&mutex);
if(rc == 0) {
printf("Semaphore try wait ok!. \n");
} else {
printf("Semaphore wait failed with ret code: %d, and err: %d. \n",
rc, errno);
}
if(rc != SEM_FAILED) {
printf("Semaphore init ok!. \n");
} else {
printf("Semaphore init failed with ret code: %d, and err: %d. \n",
rc, errno);
return 0;
}
这里的任何帮助都非常宝贵。
答案 0 :(得分:2)
sem_unlink
使用char *
这是信号量的名称。 sem_open
采用相同的方法,并返回类型为sem_t *
的信号量描述符。这是您应该传递给sem_wait
的信号量描述符。如果您修复了一些事情,所以它实际上是在没有警告的情况下编译的,比如下面的代码,那么它的行为就像您期望的那样:
#include <semaphore.h>
#include <stdio.h>
#include <sys/errno.h>
int main(int argc, char **argv)
{
const char *semaphore_name = "my-test-semaphore";
int rc = sem_unlink(semaphore_name);
if (rc)
perror("sem_unlink");
sem_t *semaphore = sem_open(semaphore_name, O_CREAT, O_RDWR, 0);
if (semaphore == SEM_FAILED) {
perror("sem_open");
return 1;
}
rc = sem_wait(semaphore);
if (rc) {
perror("sem_wait");
return 1;
}
return 0;
}
您还应该了解problems with POSIX semaphores,即如果您的应用程序意外退出,则很容易泄漏信号量计数。您的示例代码提到pthread_t
这一事实表明您尝试在单个进程中使用信号量。命名的POSIX信号量不是您想要的任务。