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 <stdio.h>
#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 を人間が読めるエラーメッセージに変換するために使用されます。

注意事項

  1. スレッドセーフ:マルチスレッドプログラムでは、errnoerrno は通常、スレッドローカルストレージ(Thread-Local Storage, TLS)として実装され、各スレッドが独立したエラーコードを持つことを保証します。
  2. 初期値:呼び出しが成功した場合、ライブラリ関数は通常、errnoerrno の値を変更しません。したがって、エラーを確認する前に、errnoerrno が 0 に設定されていることを確認する必要があります。
  3. エラーコードの範囲:異なるオペレーティングシステムや C 標準ライブラリの実装では、追加のエラーコードが定義される場合があります。プログラムは特定のエラーコードの数値に依存しないようにする必要があります。

エラー処理の推奨事項

  1. 戻り値を確認する:失敗する可能性のある関数を呼び出すときは、常にその戻り値を確認してください。
  2. errno をerrno0 に設定する:関数を呼び出す前に、errnoerrno を 0 に設定し、呼び出し後にerrnoerrno が変更されたかどうかを確認できます。
  3. strerror を使用するstrerror:strerror を介してstrerror 将 errno読み取り可能な文字列に変換すると、デバッグやログ記録に便利です。

要するに、<errno.h>errno は、プログラム内のエラーを報告および処理する標準化された方法を提供し、エラー処理コードをより一貫性があり保守しやすいものにします。

ライブラリマクロ

以下に、ヘッダファイル errno.h で定義されているマクロを示します:

番号マクロ & 説明
1extern int errno
これはシステムコールによって設定されるマクロで、エラーイベントにおいて一部のライブラリ関数が何のエラーが発生したかを示します。
2EDOM Domain Error
このマクロは定義域エラーを表します。入力引数が数学関数で定義された定義域を超えた場合に発生し、errno は EDOM に設定されます。
3ERANGE Range Error
このマクロは範囲エラーを表します。入力引数が数学関数で定義された範囲を超えた場合に発生し、errno は ERANGE に設定されます。
その他の拡張