~によるとこのマンページ、pipe()
アーキテクチャによっては、さまざまなプロトタイプがあります。可能な限りクロスプラットフォームになりたい場合は、プロトタイプが提供されたときにコンパイルされるコードを書く必要がありますか?これが合理的か(あるいは可能か?)?または、プリプロセッサディレクティブを使用してアーキテクチャを確認できますか?
クロスプラットフォームのテーマに関しては、POSIXは最初のプロトタイプだけを言及します。ただし、Linuxのマンページでは、2番目のページをPOSIXと互換性がないと強調表示しません。これはバグですか?
1 C ++ 20機能を使用して何かを実装しようとしましたが、まだ成功していません。
答え1
pipe
あなたが見つけたマニュアルページ2つの目的があります。
- Linuxカーネルで使用されるシステムコールインタフェースを文書化します。
- LinuxのGNU Cライブラリが提供するシステムコールラッパーを文書化します。
前者はアーキテクチャによって異なる場合があります。それがここで起こっていることです。GNU Cライブラリが提供するラッパーしかし実現POSIX pipe
API:
#include <unistd.h>
int pipe(int fildes[2]);
pipe
Alpha System Call API: System Call API などの他のアーキテクチャでも、コンパイラやリンカを使用する際のあいまいさはありません。いいえシステムのヘッダーファイルまたはシステムライブラリにこのように表示されます(マンページではこれを示すように見えますが)。 Alpha Linuxシステムでは、GNU Cライブラリはpipe
他のLinuxアーキテクチャと同様に次のように宣言されています。
/* Create a one-way communication channel (pipe).
If successful, two file descriptors are stored in PIPEDES;
bytes written on PIPEDES[1] can be read from PIPEDES[0].
Returns 0 if successful, -1 if not. */
extern int pipe (int __pipedes[2]) __THROW __wur;
したがって、アルファでは、対応するバリアントを想定するプログラムを書くとビルドされstruct fd_pair pipe(void);
ません。
システム呼び出し自体にアクセスするには、以下を使用する必要があります。syscall
GNU Cライブラリが提供する機能または、独自のシステムコールコードを記述してください。それはアーキテクチャ固有のコードを提供する必要がありますが、それに実際に関心を持つ必要がある人はほとんどいません。
残念ながら、LinuxシステムではCライブラリ自体は何も提供しないので、マニュアルページはこのように複雑になる可能性があります。したがって、システムコールをラップする関数呼び出しは、最終的にシステムコールのマニュアルページに文書化されます。システムコール自体に興味がない場合(実際にはほとんどの開発者にも興味がない場合)、次をお読みください。GNU Cライブラリのドキュメントこのライブラリを使用してCでプログラムする場合、または使用しているランタイムライブラリのドキュメント(そうでない場合)。
答え2
可能な限りクロスプラットフォームになりたい場合は、プロトタイプが提供されたときにコンパイルされるコードを書く必要がありますか?
いいえ、ここでは必要ありません。
あなたは直接システムコールのパート2のマンページエントリを見ています。これは、言語ランタイムの実装者が自分の存在を埋め、アイドルの考えを知らせるまで吸収されるドキュメントです。
セクション3、Cシリーズランタイムに関する文書が必要です。man 3 pipe
私にとっては、Google検索とコマンドとしても機能します。 Cシリーズ言語を使用していて、それが接続しようとしているプロトタイプである場合、移植可能なセクション3 APIがドキュメント内のシステム固有のセクション2 APIを呼び出すことができるように、ツールチェーンはどのように正確に配置されていますか? 。リンクしたいランタイム(libc ++、libstdc ++、またはglibc)のソースコードを取得する必要があると思います。移植可能なコードの場合は、セクション3 APIが機能する必要があります™。