エラー内容の取得
エラーが発生したときにエラーの原因を知ることはデバッグなどの観点から非常に重要になります。 ここでは、エラー内容の取得方法を説明したいと思います。
perror
プログラム中でエラーが発生したときには、perrorを利用してエラー内容の出力が出来ます。 perrorを使うと、標準エラー出力にエラー内容を書き出してくれます。
標準エラー出力へのメッセージの出力ではなく、数値としてどのようなエラーが発生したかを知りたい場合には、errnoが利用できます。 errnoには、最後に発生したエラーの内容が数値として保存されています。 errnoの変数自体はライブラリの中で宣言されています。 そのため、extern int errnoとして利用します。 変数errnoはerrno.hをincludeすれば利用できるようになります。
失敗するソケット作成
では、実際にsocketシステムコールを失敗させてみましょう。
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
int
main()
{
int sock;
sock = socket(3000, 4000, 5000);
if (sock < 0) {
perror("socket");
printf("%d\n", errno);
return 1;
}
return 0;
}
上記サンプルでは、変な値でsocketシステムコールを利用しています。 そのため、socketシステムコールは失敗します。 失敗するとif文の中に入ります。 そこで、perrorが呼ばれ、「socket: Socket type not supported」と表示されます。 エラーメッセージ中の「:」より前の部分は、perrorに渡す引数により変わります。 例えば、perror("hogehoge")というふうにすると、「hogehoge: Socket type not supported」と表示されます。
このサンプルでは、printfを使ってerrnoの値も表示しています。 表示される値はerrno.hでESOCKNOSUPPORTとしてdefineされている値になります。 (厳密にはerrno.hからincludeされるファイルに書いてあるESOCKNOSUPPORTかも知れません。)
プログラムを書くときにはエラー処理は非常に重要です。 perrorやerrnoを活用してデバッグや運用・管理のしやすいプログラミングを心がけて頂ければ幸いです。