エラー番号.h

<errno.h>は、 Cプログラミング言語標準ライブラリに含まれるヘッダーファイルですシンボル(「エラー番号」の短縮形)を使用してエラー状態を報告および取得するためのマクロを定義します。 [1]errno

errnoerrno整数変数のように動作します。特定のライブラリ関数は、エラーを検出すると、値(エラー番号)を格納します。プログラム起動時には、格納される値はゼロです。ライブラリ関数はゼロより大きい値のみを格納します。ライブラリ関数は、エラーを検出したかどうかに関係なく、戻り値を返す前に格納されている値を変更できます。[2]ほとんどの関数は、エラーを検出したことを示すために特別な値を返します。通常、ポインタを返す関数の場合はNULL、整数を返す関数の場合は-1です。いくつかの関数では、呼び出し側でゼロを事前に設定し、その後エラーが検出されたかどうかをテストする必要があります。errno

マクロはプラットフォームに応じてand/または型指定子を持つタイプのlvalueerrnoに展開されます。 [3]元々これは静的なメモリ位置でしたが、今日ではマクロはほとんどの場合、マルチスレッドを可能にするために使用され、各スレッドは独自のスレッドローカルエラー番号を参照します。intexternvolatile

ヘッダーファイルには、エラーコードを表す整数定数に展開されるマクロも定義されています。C標準ライブラリでは、以下の3つのマクロのみ定義する必要があります。[2]

エドムパラメータが関数のドメイン外であった、例:sqrt(-1)
エレンジ関数の範囲外の結果(例えば32ビット幅のシステム)strtol("0xfffffffff", NULL, 0)long
アイルセク(1994年C89規格修正1以降必須)[4] UTF-8を使用するシステムなどでの
不正なバイトシーケンスmbstowcs(buf, "\xff", 1)

AIXLinuxSolarisなどのPOSIX準拠のオペレーティングシステムには、ファイルを読み込み用に開けない場合のEACCESなど、上記よりもはるかに頻繁に使用されるエラー値が多数含まれています。 [5] C++11では、POSIX仕様にあるのと同じ値の多くも定義されています。[6]

伝統的に、 Unixシステムのマニュアルの最初のページであるintro(2)には、すべてのerrno.hマクロがリストされていますが、 Linuxではそうではなく、これらのマクロはerrno(3)にリストされています。[7]

は、 strerrorstring.hで定義)またはBSD拡張errnoを使用して、説明的な文字列に変換できます。変換結果は、 perrorstdio.hで定義)を使用して標準エラーストリームに直接出力できます。多くのUnix系システムと同様に、はスレッドセーフではないため、スレッドセーフ版が使用されますが、POSIXとGNUの定義が矛盾しているため、表よりも移植性が低くなります[8]sys_errliststrerrorstrerror_rsys_errlist

POSIXエラー

GNU Cライブラリ(GLIBC)は、ヘッダーファイルに追加のPOSIXerrno.hエラー値マクロを提供しています。[9]これらはstrerrorが提供するマクロの説明です

シンボル価値[10]説明
エペルム1操作は許可されていません
エノエント2そのようなファイル、又はディレクトリはありません
エスルチ3そのようなプロセスはありません
EINTR4中断されたシステムコール
EIO5入出力エラー
エンクシオ6そのようなデバイスまたはアドレスはありません
E2ビッグ7引数リストが長すぎます
エノエグゼック8実行形式エラー
EBADF9不正なファイル記述子
エチャイルド10子プロセスなし
再び11リソースは一時的に利用できません
エノメム12メモリを割り当てられません
アクセス13許可が拒否されました
エフォルト14住所が間違っています
ENOTBLK15ブロックデバイスが必要です
忙しい16デバイスまたはリソースがビジー状態です
存在する17ファイルが存在します
エクスデブ18無効なクロスデバイスリンク
エノデフ19そのようなデバイスはありません
エノティディル20ディレクトリではありません
エイスディール21ディレクトリです
アインヴァル22無効な引数
エンファイル23システムで開いているファイルが多すぎます
EMFILE24開いているファイルが多すぎます
エノッティ25デバイスの不適切なioctl
ETXTBSY26テキストファイルがビジー状態です
EFBIG27ファイルが大きすぎます
ENOSPC28デバイスに空き容量がありません
エスピア29不正なシーク
エロフス30読み取り専用ファイルシステム
EMLINK31リンクが多すぎる
エパイプ32壊れたパイプ
エドム33数値の引数が定義域外です
エレンジ34数値結果が範囲外です
エディアドルク35リソースのデッドロックを回避
エナメトゥーロン36ファイル名が長すぎます
エノルク37ロックは使用できません
エノシス38関数は実装されていません
空虚39ディレクトリが空ではありません
ELOOP40シンボリックリンクのレベルが多すぎる
ENOMSG42希望するタイプのメッセージがありません
EIDRM43識別子が削除されました
エクロン44チャンネル番号が範囲外です
EL2NSYNC45レベル2が同期されていません
EL3HLT46レベル3停止
EL3RST47レベル3のリセット
エルン48リンク番号が範囲外です
ユーナッチ49プロトコル ドライバーが接続されていません
エノシ50CSI構造は利用できません
EL2HLT51レベル2停止
エバデ52無効な交換
エバドル53無効なリクエスト記述子
エクスフル54交換完了
エノアノ55陽極なし
EBADRQC56無効なリクエストコード
エバズルト57無効なスロット
EBFONT59フォントファイル形式が正しくありません
エノスター60デバイスはストリームではありません
エノデータ61データなし
ETIME62タイマーが切れました
エノス63ストリーム外のリソース
エノネット64マシンがネットワークに接続されていません
有効65パッケージがインストールされていません
エレリモート66オブジェクトはリモートです
エノリンク67リンクが切断されました
EADV68広告エラー
ESRMNT69Srmount エラー
エココム70送信時に通信エラーが発生しました
エプロト71プロトコルエラー
エマルティホップ72マルチホップを試行しました
エドトドット73RFS固有のエラー
EBADMSG74不正なメッセージ
オーバーフロー75定義されたデータ型に対して値が大きすぎます
エノトニク76名前がネットワーク上で一意ではありません
EBADFD77ファイル記述子の状態が不良です
エレムチグ78リモートアドレスが変更されました
エリバック79必要な共有ライブラリにアクセスできません
エリバッド80破損した共有ライブラリへのアクセス
エリブスン81a.out の .lib セクションが破損しています
エリブマックス82共有ライブラリをリンクしようとしすぎています
エリビエグゼック83共有ライブラリを直接実行できません
アイルセク84無効または不完全なマルチバイト文字またはワイド文字
エレスタート85中断されたシステムコールは再開する必要がある
エストパイプ86ストリームパイプエラー
EUSERS87ユーザーが多すぎる
エノットソック88非ソケットに対するソケット操作
エデスタアドレス要求89宛先住所が必要です
EMSGサイズ90メッセージが長すぎます
プロトタイプ91ソケットのプロトコルタイプが間違っています
エノプロトオプト92プロトコルは利用できません
エプロトノサポート93プロトコルはサポートされていません
ESOCKTNOSUPPORT94ソケットタイプはサポートされていません
EOPNOTSUPP95操作はサポートされていません
EPFNOサポート96プロトコル ファミリはサポートされていません
EAFNOサポート97プロトコルでサポートされていないアドレス ファミリ
EADDRINUSE98このアドレスは既に使用されています
EADDRNOTAVAIL99要求されたアドレスを割り当てることができません
エネットダウン100ネットワークがダウンしています
エネトゥンリーチ101ネットワークにアクセスできません
ENETRESET102リセット時にネットワーク接続が切断されました
エコノミスト103ソフトウェアによって接続が中断されました
エコノリセット104ピアによる接続のリセット
エノブフス105バッファスペースがありません
アイスコン106トランスポートエンドポイントはすでに接続されています
エノトコン107トランスポートエンドポイントが接続されていません
シャットダウン108トランスポートエンドポイントのシャットダウン後に送信できません
ETOOMANYREFS109参照が多すぎるため、接続できません
タイムアウト110接続がタイムアウトしました
サービス拒否111接続拒否
EHOSTDOWN112ホストがダウンしています
EHOSTUNREACH113ホストへのルートがありません
すでに114操作はすでに進行中です
アインプログレス115操作は現在進行中です
エスターレ116古いファイルハンドル
ユークリーン117構造物の清掃が必要
エノトナム118XENIX の名前付きタイプファイルではありません
エナベイル119XENIXセマフォは使用できません
アイスナム120名前付きタイプファイルです
エレリモート121リモートI/Oエラー
エドクォート122ディスククォータを超えました
エノメディウム123媒体が見つかりません
ミディアムタイプ124間違ったメディアタイプ
キャンセル125操作はキャンセルされました
エノキー126必要なキーが利用できません
EKEY期限切れ127キーの有効期限が切れました
EKEYが取り消されました128キーは取り消されました
EKEY拒否129キーはサービスによって拒否されました
所有者死亡130所有者が死亡
回復不能131状態は回復できません
エルフキル132RFキルのため操作できません
133メモリページにハードウェアエラーがあります
エノサップ134サポートされていないパラメータまたはオプション
エノメディウム135不足しているメディア
アイルセク138無効なマルチバイトシーケンス
オーバーフロー139値が大きすぎます
キャンセル140非同期操作が正常に完了する前に停止しました
回復不能141状態は回復できません
所有者死亡142前の所有者が死亡
エストパイプ143ストリームパイプエラー

エラーコードのマクロ名と意味はPOSIX標準定義で定義されていますが、数値は定義されていません。ただし、慣例上、Unixの異なるバージョン間で値は同じように見えます。[要出典]プログラムは特定の数値に依存すべきではなく、関連する関数のマニュアルページのERRORSセクションで指定されたマクロ名を使用してコードをテストする必要があります。ソースコードの可読性移植性を高めるため、コードでは標準のマクロ名を使用することを強く推奨します。[11] [12]

参照

参考文献

  1. ^ プログラミング言語Cの国際規格(C11)、ISO/IEC 9899:2011、p. 205
  2. ^ ab プログラミング言語Cの国際規格(C99)、ISO/IEC 9899:1999、p. 186
  3. ^ 「エラーのチェック」. GNU Cライブラリ (glibc) . GNUプロジェクト. 2014年2月8日. 2014年6月25日閲覧
  4. ^ 「規範的補遺1の簡単な説明」 。 2013年9月12日閲覧
  5. ^ errno.h : システムエラー番号 – The Open Groupの「Base Definitions Reference, The Single UNIX Specification , Version 5」
  6. ^ 「エラー番号 - cppreference.com」 。 2015年5月8日閲覧
  7. ^ スティーブンス&ラゴ 2013、14ページ。
  8. ^ McCabe, Colin. 「strerrorの問題」www.club.cc.cmu.edu .
  9. ^ 「エラーコード(GNU Cライブラリ)」www.gnu.org . 2025年3月29日. 2025年4月5日閲覧
  10. ^ 「デバッグ:POSIXエラー」。particle.io 2025年4月5日閲覧
  11. ^ 「エラーのチェック」gnu.org . フリーソフトウェア財団. 2025年1月26日. 2025年4月6日閲覧
  12. ^ パパス、ブレント、ガジロ、ポール (2024). 「移植性のためのマクロ使用法の意味分析」IEEE/ACM第46回国際ソフトウェア工学会議論文集. pp.  1– 12. arXiv : 2401.10422 . doi :10.1145/3597503.3623323. ISBN 979-8-4007-0217-4

参考文献

  • スティーブンス、W. リチャード、ラゴ、スティーブン A. (2013年5月24日). 『UNIX環境における高度なプログラミング(第3版)』. Addison-Wesley Professional . ISBN 978-0321637734. 2015年2月27日閲覧
  • intro(2) –  FreeBSDシステムコールマニュアル
  • errno(3) –  Linuxプログラマーズマニュアル– Manned.org のライブラリ関数
  • GNU Cライブラリマニュアル: エラーコード
  • Linux 上の errno 値のリスト(数値とシンボルの両方)
Retrieved from "https://en.wikipedia.org/w/index.php?title=Errno.h&oldid=1321106669"