3

Linuxでうまく機能する非常に基本的なセマフォコードがいくつかありますが、OSXで正しく実行することはできません...それは奇妙な結果を返します...

#include <iostream>
#include <fcntl.h>
#include <stdio.h>
#include <semaphore.h>

int main()
{
    sem_t* test;
    test = sem_open("test", O_CREAT, 0, 1);

    int value;
    sem_getvalue(test, &value);
    printf("Semaphore initialized to %d\n", value);
}

これをOSXでg++を使用してコンパイルすると、次の出力が返されます。

iQudsi:Desktop mqudsi$ g++ test.cpp
iQudsi:Desktop mqudsi$ ./a.out 
Semaphore initialized to -1881139893

一方、Ubuntuでは、明らかにより健全な結果が得られます。

iQudsi: Desktop mqudsi$ g++ test.cpp -lrt
iQudsi:Desktop mqudsi$ ./a.out 
Semaphore initialized to 1

私はこれを3時間続けていますが、OSXがなぜこのような奇妙な結果を返しているのか理解できません...

セマフォ名としてファイルパスを使用してみましたが、違いはありませんでした。

私が得ることができるどんな助けにも感謝します。

4

3 に答える 3

8

エラーをテストしていますか?試す:

#include <iostream>
#include <fcntl.h>
#include <stdio.h>
#include <semaphore.h>

int main()
{
    sem_t* test;
    test = sem_open("test", O_CREAT, 0, 1);
    if (test == SEM_FAILED) {
        perror("sem_open");
        return 1;
    }

    int value;
    if (sem_getvalue(test, &value)) {
        perror("sem_getvalue");
        return 1;
    }
    printf("Semaphore initialized to %d\n", value);
}
于 2009-05-16T02:02:06.453 に答える
6
$ g++ sem-testing.cc -Wall
$ ./a.out 
sem_getvalue: Function not implemented
$ man sem_getvalue
No manual entry for sem_getvalue

現在MacOSXに実装されていない関数を使用しており、出力する整数には、整数が初期化されたデフォルトのデータが含まれています。これは、おそらくメモリ内に残っているランダムデータです。あなたがそれをゼロにしたならば、あなたとそれを設定することによって、int value = 0;あなたはこの間違いをより早く見つけたかもしれません。

これは私が使用したコードです(bdonlanに感謝します):

#include <iostream>
#include <fcntl.h>
#include <stdio.h>
#include <semaphore.h>

int main()
{
    sem_t* test;
    test = sem_open("test", O_CREAT, 0, 1);
    if (test == SEM_FAILED) {
        perror("sem_open");
        return 1;
    }

    int value;
    if (sem_getvalue(test, &value)) {
        perror("sem_getvalue");
        return 1;
    }
    printf("Semaphore initialized to %d\n", value);
}
于 2009-05-16T05:47:33.617 に答える
2

まあ、おそらくsem_open()は失敗しています-あなたはテストしませんでした。

または、OSXがデフォルトで共有posix semsをサポートしていない可能性があります。/dev/shmがマウントされていない場合、通常、システムはsem_open()をサポートしません。

SysVセマフォを使用することをお勧めします。

Slackwareに関する同様の質問がここで行われました:how-do-i-stop-semopen-failing-with-enosys

ただし、さらに検索すると、OSXという名前のセマフォがマッハセマフォの上に構築されていることがわかります。完了したら(sem_close()だけでなく、代わりに)sem_unlink()する必要があり、権限に注意する必要があります- 0ではなく0777またはおそらく0700から始めることをお勧めします。ダーウィンのposizセマフォを参照してください。

于 2009-05-16T02:21:40.213 に答える