Pipe() のさまざまなプロトタイプ処理

Pipe() のさまざまなプロトタイプ処理

~によるとこのマンページpipe()アーキテクチャによっては、さまざまなプロトタイプがあります。可能な限りクロスプラットフォームになりたい場合は、プロトタイプが提供されたときにコンパイルされるコードを書く必要がありますか?これが合理的か(あるいは可能か?)?または、プリプロセッサディレクティブを使用してアーキテクチャを確認できますか?

クロスプラットフォームのテーマに関しては、POSIXは最初のプロトタイプだけを言及します。ただし、Linuxのマンページでは、2番目のページをPOSIXと互換性がないと強調表示しません。これはバグですか?

1 C ++ 20機能を使用して何かを実装しようとしましたが、まだ成功していません。

ベストアンサー1

pipeあなたが見つけたマニュアルページ2つの目的があります。

  1. Linuxカーネルで使用されるシステムコールインタフェースを文書化します。
  2. LinuxのGNU Cライブラリが提供するシステムコールラッパーを文書化します。

前者はアーキテクチャによって異なる場合があります。それがここで起こっていることです。GNU Cライブラリが提供するラッパーしかし実現POSIX pipeAPI:

#include <unistd.h>

int pipe(int fildes[2]);

pipeAlpha 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);ません。

システム呼び出し自体にアクセスするには、以下を使用する必要があります。syscallGNU Cライブラリが提供する機能または、独自のシステムコールコードを記述してください。それはアーキテクチャ固有のコードを提供する必要がありますが、それに実際に関心を持つ必要がある人はほとんどいません。

残念ながら、LinuxシステムではCライブラリ自体は何も提供しないので、マニュアルページはこのように複雑になる可能性があります。したがって、システムコールをラップする関数呼び出しは、最終的にシステムコールのマニュアルページに文書化されます。システムコール自体に興味がない場合(実際にはほとんどの開発者にも興味がない場合)、次をお読みください。GNU Cライブラリのドキュメントこのライブラリを使用してCでプログラムする場合、または使用しているランタイムライブラリのドキュメント(そうでない場合)。

おすすめ記事