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


11

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間で定義が異なる機能や属性はありますか?


タイプtimer_tは「Linuxでのみ定義」されていません。たとえば、Windows / Cygwinでは定義されています。ヘッダーファイル(LinuxおよびCygwin)の定義によると、それはPOSIX標準タイプのようです。(一部のプラットフォームは標準に準拠していない場合があることを除いて、定式化されているため、「一般的に発生する」特定の状況はありません。)WRT言語ライブラリの違いに関する一般的な質問。ベンダーが標準に準拠しているかどうか、またはベンダーが準拠しているバージョンに依存します。
Janis


@MarkPlotnick:それが答えです
オービットでの軽さのレース

@LightningRacisinObritコメントとして(部分的な)回答を書いたことを後悔しています。削除しました。
マークプロトニック2015

回答:


11

UnixとCは、ニュージャージー州のベル研究所でほぼ同時に開発され、Cの主な目的の1つは、アーキテクチャに依存しない高水準のポータブル言語を使用してUnixを実装することでした。ただし、1983年まで正式な標準化はありませんでした 。POSIX、「ポータブルオペレーティングシステムインターフェース」は、「Unix Wars」の時代にさかのぼるIEEEオペレーティングシステム標準です。それはそれ以来進化を続けており、現在、そのような標準の中で最も広く実装されています。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場合features.hに設定されている内部glibcのシンボルである_POSIX_C_SOURCE >= 199309LPOSIX.1bは(参照サポートされることを意味し、feature_test_macrosのマンページ)。これもでサポートされてい_XOPEN_SOURCE >= 600ます。

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

Cに関しては、POSIXシステムの中で、それを回避するための努力があると思いますが、それは起こります。sterror_r()POSIXの対応するものからの互換性のないシグネチャを持ついくつかのGNU拡張機能(など)があります。おそらく、これはPOSIXが拡張機能を取り上げて変更した場合に発生する可能性があります。そうでない場合は、GNUが思い描いた代替手段にすぎません#define。適切なを使用して、どちらか一方を選択できます。


非常に素晴らしい!なんて親切な説明だ!
カザミア2015

1
POSIXとCの標準は、CをUnixから分離することに関するものでした。この2つは緊密に結びついているため、何がどこにあるのかはっきりしない場合があります。
teppic

2

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.