C ライブラリマクロ -errno

C 标准库 - <errno.h>C 標準ライブラリ - <errno.h>

説明

C ライブラリマクロextern int errnoはシステムコールや一部のライブラリ関数によってエラーイベント時に設定され、何のエラーが発生したかを示します。

errnoは C 標準ライブラリのマクロで、定義されています<errno.h>ヘッダーファイル内にあります。プログラムの実行中に発生したエラーを示すために使用されます。errno実際には整数変数であり、エラーコードを格納するために使用されます。ライブラリ関数はエラーが発生したときにerrno適切なエラーコードを設定し、プログラムがこれらのエラーを検査および処理できるようにします。

宣言

以下は errno マクロの宣言です。

extern int errno

パラメータ

  • NA

戻り値

  • NA

使用errnoの手順

  1. ヘッダーファイルをインクルードする:使用するerrno前に、インクルードする必要があります<errno.h>ヘッダーファイルを。
  2. 関数を呼び出す:設定する可能性のあるerrno関数。
  3. 確認errno:関数がエラーを示す戻り値を返したときに、確認しますerrnoエラーの種類を取得します。
  4. エラーを処理する:に基づきerrnoの値に基づき、適切なエラー処理を行います。

例

以下の例は errno マクロの使い方を示しています。

例

#include <stdio.h> #include <errno.h> #include <string.h> extern int errno ; int main () { FILE *fp; fp = fopen("file.txt", "r"); if( fp == NULL ) { fprintf(stderr, "Value of errno: %d\n", errno); fprintf(stderr, "Error opening file: %s\n", strerror(errno)); } else { fclose(fp); } return(0); }

上記のプログラムをコンパイルして実行してみましょう。ファイルがfile.txt存在しない場合、次の結果が生成されます。

Value of errno: 2
Error opening file: No such file or directory

一般的なerrno 值

  • 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:パイプが破損しています

注意事項

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

エラー処理の推奨事項

  1. 戻り値を確認する:失敗する可能性のある関数を呼び出すときは、常にその戻り値を確認してください。
  2. 設定errnoを 0 に:関数呼び出しの前に、設定できますerrno0 に設定して、関数呼び出し後に確認するためにerrno変更されたかどうか。
  3. 使用strerrorとperror:strerror関数を使用してerrno読み取り可能なエラーメッセージ文字列に変換します;perror関数は説明的なエラーメッセージを含むerrno値を出力します。

詳細なエラー処理

以下は、さまざまなerrno値を処理する方法を示す、より詳細な例です:

例

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    FILE *file = fopen("nonexistent_file.txt", "r");
    if (file == NULL) {
        switch (errno) {
            case EACCES:
                printf("Error: Permission denied\n");
                break;
            case ENOENT:
                printf("Error: No such file or directory\n");
                break;
            default:
                printf("Error opening file: %s\n", strerror(errno));
        }
        return 1;
    }

    // ファイル処理コード
    fclose(file);
    return 0;
}

この例では、特定のerrno値を確認し、それに応じた処理を行いました。もしerrnoであるEACCES(権限が拒否されました)またはENOENT(そのようなファイルまたはディレクトリはありません)の場合は、特定のエラーメッセージを出力します。それ以外の場合は、一般的なエラーメッセージを出力します。

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

C 标准库 - <errno.h>C 標準ライブラリ - <errno.h>

その他の拡張