web-dev-qa-db-ja.com

Linuxの「time.h」で「timer_t」が定義されているが、OS Xでは定義されていない理由

Cのソースコードファイルを読んでいるときに、この宣言が見つかりました。 (このソースコードはLinuxシステムプログラム用に記述されています。これは非常に重要な情報です)

#include <time.h>
#include <stdio.h>

static timer_t* _interval_timer;
...

最初は「timer_t」についてもっと知りたかった。そこで、ヘッダー情報を取得するために「time.h」をグーグルで検索しました。しかし、「timer_t」については何も言わず、「time_t」についてのみ言及しました。

好奇心で、「mac」コンピューターで「time.h」c標準ライブラリファイルを検索して開きました(ご存じのとおり、/ usr/includeフォルダーにはc標準ライブラリファイルが格納されています)。しかし、このファイルは以前のGoogleのものと同じでした。

最後に、仮想マシンを使用してLinux os(ubuntu)をオンにし、linux c標準ライブラリフォルダー(フォルダーパスはOSXと同じ)の 'time.h'を開きました。予想通り、Linuxの 'time.h'ファイルにはtimer_tの宣言があります。

以下に「timer_t」タイプを宣言するコード行を追加しました。

#if !defined __timer_t_defined && \
((defined _TIME_H && defined __USE_POSIX199309) || defined __need_timer_t)
# define __timer_t_defined      1

# include <bits/types.h>

/* Timer ID returned by `timer_create'.  */
typedef __timer_t timer_t;

私の質問はこれです。

  1. なぜ 'timer_t'はLinux C標準ライブラリでのみ定義されているのですか?

  2. この状況は一般的に起こりますか?つまり、OS間で定義が異なる機能や属性はありますか?

11
casamia

UnixとCは、ニュージャージー州のベル研究所でほぼ同時に開発され、Cの主要な目的の1つは、アーキテクチャに依存しない高水準のポータブル言語を使用してUnixを実装することでした。ただし、1983年まで正式な標準化はありませんでした。 [〜#〜] posix [〜#〜] 、「ポータブルオペレーティングシステムインターフェイス」は、当時のIEEEオペレーティングシステム標準です "Unix Wars" 。それはそれ以来進化を続けており、現在、そのような標準の中で最も広く実装されています。 OSXは公式にPOSIXに準拠しており、Linuxは非公式に準拠しています-Linuxディストリビューションが関与していない公式準拠に関連するロジスティクスとコストがあります。

POSIXが重点的に取り組んでいることの多くは、ISO Cの一部ではないものの精巧化です。Time.hはそうですが、ISOバージョンには、_timer_t_タイプやそれを使用する関数は含まれていません。それらは POSIX拡張 からのものであるため、Linuxヘッダーのこの参照:

_#if !defined __timer_t_defined && \
((defined _TIME_H && defined __USE_POSIX199309)
_

___USE_POSIX199309_は、__POSIX_C_SOURCE >= 199309L_のときにfeatures.hで設定される内部glibcシンボルであり、POSIX.1bがサポートされることを意味します( feature_test_macros のマンページを参照)。これは__XOPEN_SOURCE >= 600_でもサポートされています。

異なるOS間で異なる定義の関数または属性はありますか?

Cに関しては、POSIXシステムの中で、それを回避しようとする努力があると思いますが、それは起こります。いくつかのGNU拡張機能(たとえばsterror_r())があり、それらはPOSIXの対応するものからの互換性のないシグネチャを持っています。 GNU-によって考え出された代替案のみ-適切な_#define_を使用して、どちらか一方を選択できます。

11
goldilocks

_timer_t_は timer_create() などのPOSIXのtimer_ APIによって使用されます。 UNIX 03バージョンのPOSIXでは、これらはPOSIXのオプションの部分であり、macOSはそれを実装していません。 LinuxとSolaris、そしておそらく他のいくつかのUN * Xもそうでした。

したがって、探していたコードはLinuxおよびSolarisでは機能する可能性がありますが、Appleが将来的にタイマーAPIを実装しない限り、macOSでは機能しません。(これらは現在のバージョンの一部です) POSIX仕様のAppleが仕様のバージョン3ではなくバージョン4に準拠したい場合、Apple $ ===はそうする必要があります。)

2
user392227