2013-03-02 21 views
0

我試圖編寫一個簡單的信號程序,並發現了幾個不同的東西在OSX中。我使用Mountain Lion和最新的Xcode版本。忘記的語法錯誤,缺少大括號的..因爲我有以下更多的代碼,並沒有複製完整的片段,sem_wait POSIX API和OSX

基本上我除了代碼停止與sem_wait,而不是超越。

代碼編譯,並輸出結果如下

​​

追溯錯誤代碼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; 
    } 

這裏任何幫助是非常寶貴的。

+2

你可以發佈實際編譯的代碼嗎? 'mutex'沒有在任何地方聲明。 'sem_unlink'和'sem_open'採用'char *',而'sem_wait'採用'sem_t *',但是您將相同的值傳遞給所有三個。 'errno'值爲9('EBADF')與將錯誤數據傳遞給'sem_wait'一致。 – bdash 2013-03-02 05:34:51

+0

你正嘗試等待失敗的公開呼叫。可能是互斥體初始化的問題。 – 2013-03-02 05:38:22

回答

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的,即它很容易泄漏信號請計算您的應用程序是否意外退出。您的示例代碼提示您嘗試在單個進程中使用信號量。命名的POSIX信號量不是你想要完成的任務。

+0

POSIX信號量對於這個任務來說是非常好的工具,但是你想要匿名的(由'sem_init'創建的),而不是命名的。不幸的是,OSX是越野車,匿名信號量不適用於它。 – 2013-03-02 06:22:27

+0

bdash - 你是對的,我搞亂了這個論點,並且把不好的類型傳給了sen_wait。, – devgp 2013-03-02 07:35:18

+0

感謝你的澄清R ..,我已經調整了措詞,明確指出我特指_named_ POSIX信號量而不是POSIX信號量。 – bdash 2013-03-02 08:32:40