C 標準ライブラリ -<errno.h>
概要
C 標準ライブラリのerrno.hヘッダファイルは整数変数を定義しますerrnoこれはシステムコールによって設定され、エラーイベントにおいて一部のライブラリ関数が何のエラーが発生したかを示します。このマクロは int 型の変更可能な左辺値に展開されるため、プログラムによって読み取りおよび変更が可能です。
<errno.h>は C 標準ライブラリ内のヘッダファイルであり、プログラム内でエラーを報告および処理する仕組みを提供します。このヘッダファイルは、実行時エラーの種類を示して説明するためのマクロと変数を定義しています。
errno.hヘッダファイルは、さまざまなエラーコードを表す一連のマクロを定義しています。これらのマクロは、型がintint の整数定数式に展開される必要があります。
errnoは、最近発生したエラーコードを格納するためのグローバル変数です。この変数の型はintint です。ライブラリ関数でエラーが発生すると、通常は errno を設定してerrnoエラーの種類を示します。
例えば、ファイル操作において、fopenfopen 関数がファイルが存在しないために失敗した場合、errno をerrnoに設定します。ENOENT。
よく使われるエラーコード
以下は、いくつかの一般的なエラーコードです。これらは<errno.h>内でマクロとして定義されています:
EPERM:操作が許可されていませんENOENT:そのようなファイルまたはディレクトリはありませんESRCH:そのようなプロセスはありませんEINTR:中断されたシステムコールEIO:入力/出力エラーENXIO:そのようなデバイスまたはアドレスはありませんE2BIG:引数リストが長すぎますENOMEM:メモリ不足EACCES:許可が拒否されましたEFAULT:不正なアドレスEBUSY:リソースがビジーですEEXIST:ファイルはすでに存在しますEXDEV:デバイス間リンクENODEV:そのようなデバイスはありませんENOTDIR:ディレクトリではありませんEISDIR:ディレクトリですEINVAL:無効な引数ENFILE:システムファイルテーブルがオーバーフローEMFILE:開いているファイルが多すぎますENOTTY:端末デバイスではありませんETXTBSY:テキストファイルがビジーですEFBIG:ファイルが大きすぎますENOSPC:デバイスに空き容量がありませんESPIPE:不正なアドレス指定EROFS:読み取り専用ファイルシステムEMLINK:リンクが多すぎますEPIPE:パイプが破損しています
使用例
以下は、errno を使用した簡単な例で、ファイルを開くエラーを処理する方法を示しています:
実例
#include <errno.h>
#include <string.h>
int main() {
FILE *file = fopen("nonexistent_file.txt", "r");
if (file == NULL) {
printf("Error opening file: %s\n", strerror(errno));
return 1;
}
// ファイル処理コード
fclose(file);
return 0;
}
この例では、fopenfopen 関数が失敗した場合、errnoerrno が対応するエラーコードに設定されます。strerrorstrerror 関数は、errnoerrno を人間が読めるエラーメッセージに変換するために使用されます。
注意事項
- スレッドセーフ:マルチスレッドプログラムでは、
errnoerrno は通常、スレッドローカルストレージ(Thread-Local Storage, TLS)として実装され、各スレッドが独立したエラーコードを持つことを保証します。 - 初期値:呼び出しが成功した場合、ライブラリ関数は通常、
errnoerrno の値を変更しません。したがって、エラーを確認する前に、errnoerrno が 0 に設定されていることを確認する必要があります。 - エラーコードの範囲:異なるオペレーティングシステムや C 標準ライブラリの実装では、追加のエラーコードが定義される場合があります。プログラムは特定のエラーコードの数値に依存しないようにする必要があります。
エラー処理の推奨事項
- 戻り値を確認する:失敗する可能性のある関数を呼び出すときは、常にその戻り値を確認してください。
- errno を
errno0 に設定する:関数を呼び出す前に、errnoerrno を 0 に設定し、呼び出し後にerrnoerrno が変更されたかどうかを確認できます。 - strerror を使用する
strerror:strerror を介してstrerror将errno読み取り可能な文字列に変換すると、デバッグやログ記録に便利です。
要するに、<errno.h>errno は、プログラム内のエラーを報告および処理する標準化された方法を提供し、エラー処理コードをより一貫性があり保守しやすいものにします。
ライブラリマクロ
以下に、ヘッダファイル errno.h で定義されているマクロを示します:
| 番号 | マクロ & 説明 |
|---|---|
| 1 | extern int errno これはシステムコールによって設定されるマクロで、エラーイベントにおいて一部のライブラリ関数が何のエラーが発生したかを示します。 |
| 2 | EDOM Domain Error このマクロは定義域エラーを表します。入力引数が数学関数で定義された定義域を超えた場合に発生し、errno は EDOM に設定されます。 |
| 3 | ERANGE Range Error このマクロは範囲エラーを表します。入力引数が数学関数で定義された範囲を超えた場合に発生し、errno は ERANGE に設定されます。 |