C ライブラリマクロ -errno
説明
C ライブラリマクロextern int errnoはシステムコールや一部のライブラリ関数によってエラーイベント時に設定され、何のエラーが発生したかを示します。
errnoは C 標準ライブラリのマクロで、定義されています<errno.h>ヘッダーファイル内にあります。プログラムの実行中に発生したエラーを示すために使用されます。errno実際には整数変数であり、エラーコードを格納するために使用されます。ライブラリ関数はエラーが発生したときにerrno適切なエラーコードを設定し、プログラムがこれらのエラーを検査および処理できるようにします。
宣言
以下は errno マクロの宣言です。
extern int errno
パラメータ
- NA
戻り値
- NA
使用errnoの手順
- ヘッダーファイルをインクルードする:使用する
errno前に、インクルードする必要があります<errno.h>ヘッダーファイルを。 - 関数を呼び出す:設定する可能性のある
errno関数。 - 確認
errno:関数がエラーを示す戻り値を返したときに、確認しますerrnoエラーの種類を取得します。 - エラーを処理する:に基づき
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:パイプが破損しています
注意事項
- スレッドセーフ:マルチスレッド環境では、
errno通常はスレッドローカルストレージ(Thread-Local Storage, TLS)として実装され、各スレッドが独立したerrno値を持ちます。 - 初期値:関数呼び出しが成功したとき、
errno通常は変更されません。したがって、エラーを処理する前に、errno0 に設定されていることを確認する必要があります。 - プラットフォーム間の差異:異なるオペレーティングシステムや C 標準ライブラリの実装は追加のエラーコードを定義する場合があります。プログラムは特定のエラーコードの数値に依存しないようにすべきです。
エラー処理の推奨事項
- 戻り値を確認する:失敗する可能性のある関数を呼び出すときは、常にその戻り値を確認してください。
- 設定
errnoを 0 に:関数呼び出しの前に、設定できますerrno0 に設定して、関数呼び出し後に確認するためにerrno変更されたかどうか。 - 使用
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;
}
#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>