私は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 はEAGAIN
BSD と同じことを意味するため、EWOULDBLOCK
どちらも定義されたシステムで同じ値を持ちます。
答え3
errno.h
いいえ、特定のシステムに重複があってはなりません。 inなどのようにEで始まる定義があることを確認しerrno.h
(おそらく/usr/includeの下)、各ケースを処理するステートメントをENOENT
作成します。switch()
その後、すべてのシステムコールエラーに対して独自の関数を呼び出すことができます。
(実装するのとよく似ていますperror(3)
。