C/400における標準的な推薦されるエラー・メッセージの出力方法と
errno のテキストについて紹介しよう。
次のサンブル・ソースを見ていただきたい。
0001.00 #include <stdio.h> 0002.00 #include <stdlib.h> 0003.00 #include <string.h> 0004.00 #include <errno.h> 0005.00 0006.00 #define TRUE 0 0007.00 #define FALSE -1 0008.00 #define __PGM__ &__FILE__[13] 0009.00 0010.00 void main(void){ 0011.00 0012.00 printf("** TESTERRN: ERRNO の検索 **\n"); 0013.00 getchar(); 0014.00 errno = 3407; 0015.00 fprintf(stderr, "%s-%d:%s\n", __PGM__, __LINE__, strerror(errno)); 0016.00 getchar(); 0017.00 }
** TESTERRN: ERRNO の検索 ** > (TESTERRN)-15: 関数呼び出しが中断された。
1. エラーの出力は fprintf( stderr, .. )
で出力する。
エラーの出力を printf
文ではなく fprintf( stderr, ... )
によって出力しているのは
標準出力 printf
が別の場所をリダイレクトされてしまっているときでも
stderr
であれば正しく印刷出力することができる。
stderr
であればエラー出力だけを同じ場所に集めて出力される。
2. プログラム名を __PGM__
で出力する。
0008.00 #define __PGM__ &__FILE__[13]
によってソース・ファイルの一部を抜き出して __PGM__
をプログラム名として出力している。
エラー・メッセージを見ただけでは、どのプログラムのエラーであるかわからず、
直ちに調査を開始することはできない。
従ってエラー・メッセージにはプログラム名も併せて出力しておいたほうが良い。
3. ステートメント行を __LINE__
で出力する。
プログラムのソース・ステートメント行を __LINE__
で出力しておけば
そのプログラムのどの場所でエラーが発生したのかがすぐにわかるので
これは便利な機能である。
4. エラー内容を strerror(errno)
で出力する。
システム・エラーが発生したときに i5/OS は予約語の errno
にエラー番号を代入する。
errno
だけではエラーの内容はわからないので、strerror(errno)
を出力するように
すれば日本語で 「 関数呼び出しが中断された。」 と出力されるのでわかりやすくなる。
ただしこの日本語訳があまり適切でないこともあるため、意味不明な場合がある。
そのようなときには
ソース・メンバー QSYSINC/H(ERRNO)
を調査すればよい。いったん errno
の値を出力したから errno = 3470
であると判明すると
QSYSINC/H(ERRNO)
の英文を調べる。ソース・メンバー QSYSINC/H(ERRNO)
の #define
によってインターネットで
Linux の日本語訳を調べる
という方法がある。
つまり日本語エラー・メッセージの意味が不明であれば QSYSINC/H(ERRNO)
を
調べることによって詳しい手がかりを得ることができるのである。