すべてのシステムコールエラー番号は一意ですか?

すべてのシステムコールエラー番号は一意ですか?

私はUnixシステムプログラミングプログラムを書いていますが、要件の1つはシステムコールから返される可能性のあるすべてのエラーを処理することです。

したがって、各システムコールに専任する関数を置くよりも、この責任を担う関数を持ちたいと思います。それでは、返されたすべてのエラー番号は一意ですか?そうでない場合、どのような重複領域が存在しますか?

答え1

2つの側面があります。システムコールがエラーを通知する方法とエラーが発生する方法が報告されます。

ほとんどのシステムコールは-1を返すことでエラーが発生したことを示しますが、これは完全に普遍的なものではありません(たとえば、一部のシステムコールは常に成功しますgetpid)。

エラーが発生したことがわかっている場合、エラーコードは常にerrno¹にあります。持つ標準値は次のように定義されます。errno.h、各UNIXバリアントには独自の内容が追加されます。エラーコードは、名前が;で始まる定数で識別されますE。値はオペレーティングシステムによって異なります。これらのエラーコードは標準ですが(たとえば、EACCESS常に「許可が拒否されました」を意味し、EIO常に「入力/出力エラー」を意味します)、各エラーメッセージの正確な意味はシステムコールによって異なります。

標準機能strerrorそしてperrorユーザーに表示できるエラーメッセージを提供します。

1最後のシステム呼び出しまたはCライブラリ関数呼び出し中にエラーが発生していない場合は、ガベージを含めることができます。errno

答え2

私が知っている唯一の重複は、AT&TとBSD派生Unixの間に歴史的な違いがあった分野の同義語です。たとえば、AT&T Unix はEAGAINBSD と同じことを意味するため、EWOULDBLOCKどちらも定義されたシステムで同じ値を持ちます。

答え3

errno.hいいえ、特定のシステムに重複があってはなりません。 inなどのようにEで始まる定義があることを確認しerrno.h(おそらく/usr/includeの下)、各ケースを処理するステートメントをENOENT作成します。switch()その後、すべてのシステムコールエラーに対して独自の関数を呼び出すことができます。

(実装するのとよく似ていますperror(3)

関連情報