errno - ライブラリコールの説明 - Linux コマンド集 一覧表
- 名前
- 書式
- 説明
- 注意
名前
書式
説明
ヘッダファイル
<errno.h>
で整数型の変数
errno
が定義されており、この変数には、
システムコール及びいくつかのライブラリ関数により
エラーが発生した際にその原因を示す値が設定される。
この値はコールがエラー (通常 -1) を返した時にのみ意味を持つが、
ライブラリ関数は成功した場合も
errno
を変更することが許されている。
時には、関数が成功した場合の有効な返り値として -1 が返されることがある。
このような場合、エラーを検出するためには、呼び出しの前に
errno
を 0 にしておく必要がある。
errno
は、ISO C standard で int
型の変更可能な左辺値
として定義されており、明示的に宣言を行ってはならない;
errno
はマクロの場合もありえる。 errno
はスレッド毎に
値を持つ。つまりあるスレッドで errno
が設定されても、
他のスレッドの errno
には影響しない。
有効なエラー番号はいずれも 0 以外の値を持つ。
つまり、 errno
を 0 に設定するライブラリ関数はない。
POSIX.1 で定義されているすべてのエラー名には、
それぞれ異なる値が対応していなければならない。
但し、
EAGAIN
と
EWOULDBLOCK
は例外で、これらは同じ値を持ってもよい。
-
E2BIG
-
引き数リストが長過ぎる (POSIX.1)
-
EACCES
-
許可がない (POSIX.1)
-
EADDRINUSE
-
アドレスがすでに使用されている (POSIX.1)
-
EADDRNOTAVAIL
-
アドレスが使用できない (POSIX.1)
-
EAFNOSUPPORT
-
アドレス・ファミリーがサポートされていない (POSIX.1)
-
EAGAIN
-
リソースが一時的に利用不可
(
EWOULDBLOCK
と同じ値でもよい) (POSIX.1)
-
EALREADY
-
接続が既に処理中である (POSIX.1)
-
EBADE
-
不正なやり取り (exchange) である
-
EBADF
-
ファイルディスクリプタが不正である (POSIX.1)
-
EBADFD
-
ファイルディスクリプタが不正な状態である
-
EBADMSG
-
メッセージが不正である (POSIX.1)
-
EBADR
-
不正なリクエストディスクリプタ
-
EBADRQC
-
不正なリクエストコード
-
EBADSLT
-
不正なスロット
-
EBUSY
-
リソースが使用中である (POSIX.1)
-
ECANCELED
-
操作がキャンセルされた (POSIX.1)
-
ECHILD
-
子プロセスが無い (POSIX.1)
-
ECHRNG
-
チャンネル番号が範囲外である
-
ECOMM
-
送信時に通信エラーが発生した
-
ECONNABORTED
-
接続が中止された (POSIX.1)
-
ECONNREFUSED
-
接続が拒否された (POSIX.1)
-
ECONNRESET
-
接続がリセットされた (POSIX.1)
-
EDEADLK
-
リソースのデッドロックを回避した (POSIX.1)
-
EDEADLOCK
-
EDEADLK
の同義語
-
EDESTADDRREQ
-
宛先アドレスが必要である (POSIX.1)
-
EDOM
-
数学関数で引き数が領域外である (out of domain)
-
EDQUOT
-
ディスク・クォータ (quota) を超過した (POSIX.1)
-
EEXIST
-
ファイルが存在する (POSIX.1)
-
EFAULT
-
アドレスが不正である (POSIX.1)
-
EFBIG
-
ファイルが大き過ぎる (POSIX.1)
-
EHOSTDOWN
-
ホストがダウンしている
-
EHOSTUNREACH
-
ホストに到達不能である (POSIX.1)
-
EIDRM
-
識別子が削除された (POSIX.1)
-
EILSEQ
-
不正なバイト列 (POSIX.1, C99)
-
EINPROGRESS
-
操作が実行中である (POSIX.1)
-
EINTR
-
関数呼び出しが割り込まれた (POSIX.1)
-
EINVAL
-
引数が無効である (POSIX.1)
-
EIO
-
入出力エラー (POSIX.1)
-
EISCONN
-
ソケットが接続されている (POSIX.1)
-
EISDIR
-
ディレクトリである (POSIX.1)
-
EISNAM
-
名前付きのファイルである
-
EKEYEXPIRED
-
鍵が期限切れとなった
-
EKEYREJECTED
-
鍵がサーバにより拒否された
-
EKEYREVOKED
-
鍵が無効となった
-
EL2HLT
-
停止 (レベル 2)
-
EL2NSYNC
-
同期できていない (レベル 2)
-
EL3HLT
-
停止 (レベル 3)
-
EL3RST
-
リセット (レベル 3)
-
ELIBACC
-
必要な共有ライブラリにアクセスできなかった
-
ELIBBAD
-
壊れた共有ライブラリにアクセスしようとした
-
ELIBMAX
-
リンクしようとした共有ライブラリが多過ぎる
-
ELIBSCN
-
a.out のライブラリセクションが壊れている (corrupted)
-
ELIBEXEC
-
共有ライブラリを直接実行できなかった
-
ELOOP
-
シンボリック・リンクの回数が多過ぎる (POSIX.1)
-
EMEDIUMTYPE
-
間違ったメディア種別である
-
EMFILE
-
オープンされているファイルが多過ぎる (POSIX.1)
-
EMLINK
-
リンクが多過ぎる (POSIX.1)
-
EMSGSIZE
-
メッセージが長過ぎる (POSIX.1)
-
EMULTIHOP
-
マルチホップ (multihop) を試みた (POSIX.1)
-
ENAMETOOLONG
-
ファイル名が長過ぎる (POSIX.1)
-
ENETDOWN
-
ネットワークが不通である (POSIX.1)
-
ENETRESET
-
接続がネットワーク側から中止された (POSIX.1)
-
ENETUNREACH
-
ネットワークが到達不能である (POSIX.1)
-
ENFILE
-
システム全体でオープンされているファイルが多過ぎる (POSIX.1)
-
ENOBUFS
-
使用可能なバッファ空間がない (POSIX.1 (XSI STREAMS option))
-
ENODATA
-
ストリームの読み出しキューの先頭に読み出し可能なメッセージがない
(POSIX.1)
-
ENODEV
-
そのようなデバイスは無い (POSIX.1)
-
ENOENT
-
そのようなファイルやディレクトリは無い (POSIX.1)
-
ENOEXEC
-
実行ファイル形式のエラー (POSIX.1)
-
ENOKEY
-
要求された鍵が利用できない
-
ENOLCK
-
利用できるロックが無い (POSIX.1)
-
ENOLINK
-
リンクが切れている (POSIX.1)
-
ENOMEDIUM
-
メディアが見つからない
-
ENOMEM
-
十分な空きメモリ領域が無い (POSIX.1)
-
ENOMSG
-
要求された型のメッセージが存在しない (POSIX.1)
-
ENONET
-
マシンがネットワーク上にない
-
ENOPKG
-
パッケージがインストールされていない
-
ENOPROTOOPT
-
指定されたプロトコルが利用できない (POSIX.1)
-
ENOSPC
-
デバイスに空き領域が無い (POSIX.1)
-
ENOSR
-
指定されたストリーム・リソースが存在しない (POSIX.1 (XSI STREAMS option))
-
ENOSTR
-
ストリームではない (POSIX.1 (XSI STREAMS option))
-
ENOSYS
-
関数が実装されていない (POSIX.1)
-
ENOTBLK
-
ブロックデバイスが必要である
-
ENOTCONN
-
ソケットが接続されていない (POSIX.1)
-
ENOTDIR
-
ディレクトリではない (POSIX.1)
-
ENOTEMPTY
-
ディレクトリが空ではない (POSIX.1)
-
ENOTSOCK
-
ソケットではない (POSIX.1)
-
ENOTSUP
-
操作がサポートされていない (POSIX.1)
-
ENOTTY
-
I/O 制御操作が適切でない (POSIX.1)
-
ENOTUNIQ
-
名前がネットワークで一意ではない
-
ENXIO
-
そのようなデバイスやアドレスはない (POSIX.1)
-
EOPNOTSUPP
-
ソケットでサポートしていない操作である (POSIX.1)
(Linux では ENOTSUP と EOPNOTSUPP は同じ値を持っているが、
POSIX.1 では両者のエラーの値は区別される必要がある。)
-
EOVERFLOW
-
指定されたデータ型に格納するには値が大き過ぎる (POSIX.1)
-
EPERM
-
操作が許可されていない (POSIX.1)
-
EPFNOSUPPORT
-
サポートされていないプロトコルファミリーである
-
EPIPE
-
パイプが壊れている (POSIX.1)
-
EPROTO
-
プロトコル・エラー (POSIX.1)
-
EPROTONOSUPPORT
-
プロトコルがサポートされていない (POSIX.1)
-
EPROTOTYPE
-
ソケットに指定できないプロトコル・タイプである (POSIX.1)
-
ERANGE
-
結果が大き過ぎる (POSIX.1, C99)
-
EREMCHG
-
リモートアドレスが変わった
-
EREMOTE
-
オブジェクトがリモートにある
-
EREMOTEIO
-
リモート I/O エラー
-
ERESTART
-
システムコールが中断され再スタートが必要である
-
EROFS
-
読み出し専用のファイルシステムである (POSIX.1)
-
ESHUTDOWN
-
通信相手がシャットダウンされて送信できない
-
ESPIPE
-
無効なシーク (POSIX.1)
-
ESOCKTNOSUPPORT
-
サポートされていないソケット種別である
-
ESRCH
-
そのようなプロセスは無い (POSIX.1)
-
ESTALE
-
ファイルハンドルが古い状態になっている (POSIX.1)
NFS や他のファイルシステムで起こりうる。
-
ESTRPIPE
-
ストリーム・パイプ・エラー
-
ETIME
-
時間が経過した
(POSIX.1 (XSI STREAMS option))
(POSIX.1 では "STREAM
ioctl
()timeout" と書かれている)
-
ETIMEDOUT
-
操作がタイムアウトした (POSIX.1)
-
ETXTBSY
-
テキストファイルが使用中である (POSIX.1)
-
EUCLEAN
-
Structure needs cleaning
-
EUNATCH
-
プロトコルのドライバが付与 (attach) されていない
-
EUSERS
-
ユーザ数が多過ぎる
-
EWOULDBLOCK
-
操作がブロックされる見込みである
(
EAGAIN
と同じ値でもよい) (POSIX.1)
-
EXDEV
-
不適切なリンク (POSIX.1)
-
EXFULL
-
変換テーブルが一杯である
注意
以下はよくやる間違いである。
if (somecall() == -1) {
printf("somecall() failed\n");
if (errno == ...) { ... }
}
このようにすると、参照している時点では
errno
はもはや
somecall
()から返された値を保持しているとは限らない
(
printf
()により変更されているかもしれない)。
ライブラリコールをまたいで
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)
- Linux Tips 関連記事
- Linux Tips(目次)
- Linux ディストリビューション一覧
- rpm のファイル名にあるi386とかi686とは
- 自分のマシンの情報を調べる
- cron の設定
- ssh の root ログインを禁止する
- ssh を、ユーザ、IPでアクセス制限
- 鍵交換方式によるssh接続
- 鍵交換方式によるssh接続( windowsから )
- 複数ファイル内の文字列を置換して上書き保存する
- あるグループをイニシャルグループとするユーザー一覧出力
- 複数ファイルのファイル名を一括変換する
- 連番ファイルをコマンド一発で作成する
- 中身がランダムなファイルを任意のサイズで作成する
- Linux ユーザーアカウントをロック・アンロックする