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) を
調べることによって詳しい手がかりを得ることができるのである。