我正在尝试编写一个简单的信号量程序,并发现了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;
}这里的任何帮助都是非常宝贵的。
发布于 2013-03-02 13:46:26
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信号量不是该任务所需的。
https://stackoverflow.com/questions/15171121
复制相似问题