0

簡単なセマフォプログラムを書こうとしていますが、OSXで異なる点がいくつか見つかりました。MountainLionと最新の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;
    }

ここでの助けは非常に貴重です。

4

1 に答える 1

2

sem_unlinkchar *セマフォの名前である を取ります。sem_open同じものを取り、 type のセマフォ記述子を返します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 セマフォは、そのタスクに必要なものではありません。

于 2013-03-02T05:46:25.910 に答える