簡體   English   中英

sem_wait POSIX API和OSX

[英]sem_wait POSIX API and OSX

我試圖編寫一個簡單的信號量程序,並發現了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;
    }

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

sem_unlink一個char * ,它是信號量的名稱。 sem_open采用相同的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;
}

您還應該注意POSIX信號量存在的問題 ,即,如果您的應用程序意外退出,很容易泄漏信號量計數。 示例代碼中提到了pthread_t的事實表明您正在嘗試在單個進程中使用信號量。 命名的POSIX信號量不是該任務所需的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM