【C言語】errno.hを使ってエラーの原因を突き止める【標準ライブラリ】
- errno.hとは
- errnoの仕組み
- よく使われるエラー番号
- perror() を使ったエラー表示
- strerror() を使ったエラー表示
- ファイル操作時のエラー処理
- メモリ確保のエラー処理
- 数学関数のエラー処理
- ネットワークプログラミングでのエラー処理
- カスタムエラーメッセージの作成
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()
などが失敗すると errno
が ENOMEM
に設定されます。
#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()
を組み合わせることができます。