Scroll to navigation

ERRNO(3) Linux Programmer's Manual ERRNO(3)

名前

errno - 直近に発生したエラーの番号

書式

#include <errno.h>

説明

ヘッダファイル <errno.h> で整数型の変数 errno が定義されており、 システムコールやいくつかのライブラリ関数は、エラーが発生した際に この変数にその原因を示す値を設定する。 この値は呼び出しの返り値がエラー (ほとんどのシステムコールでは -1 で、ほとんどのライブラリ関数では -1 か NULL) を示したときに のみ意味を持つが、ライブラリ関数は成功した場合も errno を変更することが許されている。

有効なエラー番号はいずれも 0 以外の値を持つ。 どのシステムコールもライブラリ関数も errno を 0 に設定することはない。

いくつかのシステムコールやライブラリ関数 (例えば getpriority(2)) では、成功した場合の有効な返り値として -1 が返されることがある。 このような場合、成功なのかエラーなのかを区別するためには、 呼び出しの前に errno を 0 に設定しておけばよい。呼び出しの返り値がエラー発生の可能性を 示すものだった場合には、 errno が 0 以外の値かを見て確認すればよい。

errno は、ISO C standard で int 型の変更可能な左辺値 として定義されており、明示的に宣言を行ってはならない; errno はマクロの場合もありえる。 errno はスレッド毎に値を持つ。 つまりあるスレッドで errno が設定されても、 他のスレッドの errno には影響しない。

POSIX.1 で定義されているすべてのエラー名には、 それぞれ異なる値が対応していなければならない。 但し、 EAGAINEWOULDBLOCK は例外で、これらは同じ値を持ってもよい。

引き数リストが長過ぎる (POSIX.1)
許可がない (POSIX.1)
アドレスがすでに使用されている (POSIX.1)
アドレスが使用できない (POSIX.1)
アドレス・ファミリーがサポートされていない (POSIX.1)
リソースが一時的に利用不可 (EWOULDBLOCK と同じ値でもよい) (POSIX.1)
接続が既に処理中である (POSIX.1)
不正なやり取り (exchange) である
ファイルディスクリプタが不正である (POSIX.1)
ファイルディスクリプタが不正な状態である
メッセージが不正である (POSIX.1)
不正なリクエストディスクリプタ
不正なリクエストコード
不正なスロット
リソースが使用中である (POSIX.1)
操作がキャンセルされた (POSIX.1)
子プロセスが無い (POSIX.1)
チャンネル番号が範囲外である
送信時に通信エラーが発生した
接続が中止された (POSIX.1)
接続が拒否された (POSIX.1)
接続がリセットされた (POSIX.1)
リソースのデッドロックを回避した (POSIX.1)
EDEADLK の同義語
宛先アドレスが必要である (POSIX.1)
数学関数で引き数が領域外である (out of domain)
ディスク・クォータ (quota) を超過した (POSIX.1)
ファイルが存在する (POSIX.1)
アドレスが不正である (POSIX.1)
ファイルが大き過ぎる (POSIX.1)
ホストがダウンしている
ホストに到達不能である (POSIX.1)
識別子が削除された (POSIX.1)
不正なバイト列 (POSIX.1, C99)
操作が実行中である (POSIX.1)
関数呼び出しが割り込まれた (POSIX.1); signal(7) 参照。
引数が無効である (POSIX.1)
入出力エラー (POSIX.1)
ソケットが接続されている (POSIX.1)
ディレクトリである (POSIX.1)
名前付きのファイルである
鍵が期限切れとなった
鍵がサーバにより拒否された
鍵が無効となった
停止 (レベル 2)
同期できていない (レベル 2)
停止 (レベル 3)
リセット (レベル 3)
必要な共有ライブラリにアクセスできなかった
壊れた共有ライブラリにアクセスしようとした
リンクしようとした共有ライブラリが多過ぎる
a.out のライブラリセクションが壊れている (corrupted)
共有ライブラリを直接実行できなかった
シンボリック・リンクの回数が多過ぎる (POSIX.1)
間違ったメディア種別である
オープンされているファイルが多過ぎる (POSIX.1)
リンクが多過ぎる (POSIX.1)
メッセージが長過ぎる (POSIX.1)
マルチホップ (multihop) を試みた (POSIX.1)
ファイル名が長過ぎる (POSIX.1)
ネットワークが不通である (POSIX.1)
接続がネットワーク側から中止された (POSIX.1)
ネットワークが到達不能である (POSIX.1)
システム全体でオープンされているファイルが多過ぎる (POSIX.1)
使用可能なバッファ空間がない (POSIX.1 (XSI STREAMS option))
ストリームの読み出しキューの先頭に読み出し可能なメッセージがない (POSIX.1)
そのようなデバイスは無い (POSIX.1)
そのようなファイルやディレクトリは無い (POSIX.1)
実行ファイル形式のエラー (POSIX.1)
要求された鍵が利用できない
利用できるロックが無い (POSIX.1)
リンクが切れている (POSIX.1)
メディアが見つからない
十分な空きメモリ領域が無い (POSIX.1)
要求された型のメッセージが存在しない (POSIX.1)
マシンがネットワーク上にない
パッケージがインストールされていない
指定されたプロトコルが利用できない (POSIX.1)
デバイスに空き領域が無い (POSIX.1)
指定されたストリーム・リソースが存在しない (POSIX.1 (XSI STREAMS option))
ストリームではない (POSIX.1 (XSI STREAMS option))
関数が実装されていない (POSIX.1)
ブロックデバイスが必要である
ソケットが接続されていない (POSIX.1)
ディレクトリではない (POSIX.1)
ディレクトリが空ではない (POSIX.1)
ソケットではない (POSIX.1)
操作がサポートされていない (POSIX.1)
I/O 制御操作が適切でない (POSIX.1)
名前がネットワークで一意ではない
そのようなデバイスやアドレスはない (POSIX.1)
ソケットでサポートしていない操作である (POSIX.1)

(Linux では ENOTSUPEOPNOTSUPP は同じ値を持つが、 POSIX.1 に従えば両者のエラー値は区別されるべきである。)

指定されたデータ型に格納するには値が大き過ぎる (POSIX.1)
操作が許可されていない (POSIX.1)
サポートされていないプロトコルファミリーである
パイプが壊れている (POSIX.1)
プロトコル・エラー (POSIX.1)
プロトコルがサポートされていない (POSIX.1)
ソケットに指定できないプロトコル・タイプである (POSIX.1)
結果が大き過ぎる (POSIX.1, C99)
リモートアドレスが変わった
オブジェクトがリモートにある
リモート I/O エラー
システムコールが中断され再スタートが必要である
読み出し専用のファイルシステムである (POSIX.1)
通信相手がシャットダウンされて送信できない
無効なシーク (POSIX.1)
サポートされていないソケット種別である
そのようなプロセスは無い (POSIX.1)
ファイルハンドルが古い状態になっている (POSIX.1)

NFS や他のファイルシステムで起こりうる。

ストリーム・パイプ・エラー
時間が経過した (POSIX.1 (XSI STREAMS option))

(POSIX.1 では "STREAM ioctl(2) timeout" と書かれている)

操作がタイムアウトした (POSIX.1)
テキストファイルが使用中である (POSIX.1)
Structure needs cleaning
プロトコルのドライバが付与 (attach) されていない
ユーザ数が多過ぎる
操作がブロックされる見込みである (EAGAIN と同じ値でもよい) (POSIX.1)
不適切なリンク (POSIX.1)
変換テーブルが一杯である

注意

以下はよくやる間違いである。

if (somecall() == -1) {

printf("somecall() failed\n");
if (errno == ...) { ... } }

このようにすると、参照している時点では errno はもはや somecall() から返された値を保持しているとは限らない (printf(3) により変更されているかもしれない)。 ライブラリコールをまたいで errno の値を保存したい場合は、以下のように保存しなければならない:

if (somecall() == -1) {

int errsv = errno;
printf("somecall() failed\n");
if (errsv == ...) { ... } }

昔の C では、 <errno.h> をインクルードするのではなく errno を手動で (extern int errno のように) 定義するのが一般的であった。 このようなことはしないこと。 こうすると、最近のバージョンの C ライブラリでは正しく動作しないだろう。 しかし、(非常に) 古い Unix システムでは、 <errno.h> がなく、宣言が必要なことがあるかもしれない。 err(3), error(3), perror(3), strerror(3)

2008-07-09