【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() を組み合わせることができます。