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;
私の問題はこれです。
なぜ 'timer_t'はLinux C標準ライブラリにのみ定義されていますか?
これは一般的なことですか?つまり、オペレーティングシステムごとに異なる定義された機能や属性はありますか?
答え1
UnixとCは互いに絡み合った歴史を持っています。どちらもニュージャージー州のBell Labsで同じ時期に開発されました。しかし、1983年まで正式な標準化は行われませんでした。 POSIX、「ポータブルオペレーティングシステムインタフェース」は、2007年から始まったIEEEオペレーティングシステム標準です。「UNIX戦争」。それ以来、継続的に発展してきており、現在は同種標準の中で最も広く実装されている標準となっています。 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)
POSIX.1bのサポートを表す__USE_POSIX199309
feature.hで設定された内部glibcシンボルです(参照:_POSIX_C_SOURCE >= 199309L
機能テストマクロマンページ)。これもサポートされています_XOPEN_SOURCE >= 600
。
オペレーティングシステムごとに異なる定義の機能や属性はありますか?
私の考えにCを使用するPOSIXシステムでは、人々はこれを避けようとしていますが、実際にそのようなことが起こります。sterror_r()
POSIX対応と互換性のない署名を持ついくつかのGNU拡張(例:)があります。これは、POSIXが拡張機能を使用していますが、これを修正したり、GNU Dreamの代替案である場合に発生する可能性があります。適切な#define
。
答え2
timer_t
POSIX の timer_ API で使用されます。例:timer_create()
。 POSIXのUNIX 03バージョンでは、これはPOSIXのオプション部分であり、macOSでは実装されていません。これは、Linux、Solaris、およびその他の一部のUN * Xにも当てはまります。
したがって、見ているコードはLinuxとSolarisでは動作しますが、Appleが将来のタイマーAPIを実装しない限り、macOSでは動作しない可能性があります。 (これらは現在のバージョンのPOSIX仕様の一部であるため、Appleがバージョン3の代わりにバージョン4の仕様に準拠するにはこれを行う必要があります。)