POSIX sem_init()
関数を使用してプログラムをコンパイルすると、コンパイル時に関数が廃止されているというコンパイル警告(通常は_-Werror
_を使用するためエラー)が表示されますMac OS X 10.10.1(Yosemite)とGCC 4.9.1、またはXCode 6.1.1のClang(Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
)のバージョン。 _/usr/include/sys/semaphore.h
_をざっと見てみると、関数の宣言の後に実際に___deprecated
_タグがあり、 sem_getvalue()
および sem_destroy()
。
質問:
POSIX仕様に非推奨のヒントがないことを考えると、これらの3つの関数がMac OS Xで非推奨として選択されているのはなぜですか?
それらが非推奨であることを考えると、置換は何であり、なぜ置換が好ましいのですか?
(私は最初にチェックしました 異なる質問 最初にタグ付けされた質問はありません c と非推奨のシステムコールについて尋ねる質問はありません—プログラムのみです。 )
自分が取り組んでいるライブラリをOS Xに移植しようとしたときに、自分でこの問題に遭遇しました。すばらしい答えを見つけることなくしばらく探しました。私が答えを見つけたとき、私は少し混乱しました:答えは事実上 "if Apple POSIXの名前のないセマフォを実装した場合、Xサーバーをいくつ購入しますか?" 。
それらが非推奨である理由と、一部の機能が未実装のままである理由の要点を要約すると、次のようになります。
sem_t
タイプを共有するPOSIX名前付きセマフォとの下位互換性は難しい代わりに何をするかについては、GCDセマフォを使いました。なぜ置換が推奨されるのか:バニラOS Xで利用できる唯一のネイティブの名前のないセマフォインターフェースです。GCDがXサーバーの販売を促進したようです。これ以上の答えはないでしょう。
ただし、うまくいけば、いくつかのコードが役立つでしょう。これらすべての結果として、独自のポータブルセマフォインターフェースを効果的に実装する必要があります。
#ifdef __Apple__
#include <dispatch/dispatch.h>
#else
#include <semaphore.h>
#endif
struct rk_sema {
#ifdef __Apple__
dispatch_semaphore_t sem;
#else
sem_t sem;
#endif
};
static inline void
rk_sema_init(struct rk_sema *s, uint32_t value)
{
#ifdef __Apple__
dispatch_semaphore_t *sem = &s->sem;
*sem = dispatch_semaphore_create(value);
#else
sem_init(&s->sem, 0, value);
#endif
}
static inline void
rk_sema_wait(struct rk_sema *s)
{
#ifdef __Apple__
dispatch_semaphore_wait(s->sem, DISPATCH_TIME_FOREVER);
#else
int r;
do {
r = sem_wait(&s->sem);
} while (r == -1 && errno == EINTR);
#endif
}
static inline void
rk_sema_post(struct rk_sema *s)
{
#ifdef __Apple__
dispatch_semaphore_signal(s->sem);
#else
sem_post(&s->sem);
#endif
}
これは、私が気にかけた最小限の機能セットでした。あなたのニーズは異なる場合があります。うまくいけば、これは役に立ちます。