【C言語】errno.hを使ってエラーの原因を突き止める【標準ライブラリ】

【C言語】errno.hを使ってエラーの原因を突き止める【標準ライブラリ】

errno.hとは

errno.h は、C言語の標準ライブラリに含まれるヘッダーファイルで、エラーコードを管理するために使用されます。 主に、システムコールや標準ライブラリ関数が失敗した際に、エラーの種類を識別するために利用されます。

errnoの仕組み

errno はグローバル変数であり、エラーが発生すると関数がこれを設定します。 ただし、エラーが発生しなければerrnoの値は変わりません。そのため、関数の呼び出し前にerrnoを明示的に0にリセットするのが一般的です。

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

int main() {
    errno = 0; // 初期化
    printf("現在の errno: %d\n", errno);
    return 0;
}

よく使われるエラー番号

主なエラー番号の一覧と意味は以下の通りです。

  • EPERM (1) – 操作が許可されていない
  • ENOENT (2) – ファイルやディレクトリが存在しない
  • ESRCH (3) – 指定したプロセスが存在しない
  • EINTR (4) – システムコールがシグナルによって中断された
  • ENOMEM (12) – メモリ不足
  • EACCES (13) – アクセス権限がない

perror() を使ったエラー表示

perror() 関数は、エラーメッセージを標準エラー出力に表示するのに便利です。

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

int main() {
    FILE *file = fopen("non_existent.txt", "r");
    if (!file) {
        perror("ファイルを開けません");
    }
    return 0;
}

strerror() を使ったエラー表示

strerror() 関数を使うと、errno の値に対応するエラーメッセージを取得できます。

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

int main() {
    errno = ENOENT;
    printf("エラー: %s\n", strerror(errno));
    return 0;
}

ファイル操作時のエラー処理

ファイル操作では、fopen() などが失敗すると errno が設定されます。

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

int main() {
    FILE *file = fopen("/root/protected.txt", "r");
    if (!file) {
        perror("ファイルを開けません");
    }
    return 0;
}

メモリ確保のエラー処理

malloc() などが失敗すると errnoENOMEM に設定されます。

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

int main() {
    size_t size = 1024L * 1024L * 1024L * 1024L; // 1TB
    void *ptr = malloc(size);
    if (!ptr) {
        perror("メモリ確保に失敗しました");
    }
    return 0;
}

数学関数のエラー処理

math.h の一部の関数(例えば sqrt())では、エラーが発生すると errno が設定されます。

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

int main() {
    errno = 0;
    double result = sqrt(-1);
    if (errno) {
        perror("数学エラー");
    }
    return 0;
}

ネットワークプログラミングでのエラー処理

ソケット関数が失敗すると errno にエラーコードが設定されます。

カスタムエラーメッセージの作成

カスタムメッセージを出力する場合、snprintf()strerror() を組み合わせることができます。

コメントは受け付けていません。