Linux Kernel: エラー番号の一覧
前書き
本記事では、Linux Kernelが用いるエラー番号を説明します。
Linux Kernelがエラー番号(errno)を正しく返す意義
Linux Kernelでは、エラーの種類に応じて、返すべきエラー番号が定められています。例えば、ファイルが存在しない場合は、”ENOENT(No such file or directory、 エラー番号2)”を返します。Linux Kernel内のエラー内容は、変数errnoを通してUser空間にも伝わります。
Linux Kernel内で誤ったエラー番号を使用した場合、その影響は広範囲に渡ります。Kernel空間は勿論ですが、User空間アプリケーションに本来であれば不要であった判断や対応を強いる事になります。さらに、エラー番号の誤りに気づき、Kernelコードを修正した後もまた、Kernel空間/User空間の両方に影響が出ます。
すなわち、他の人に迷惑をかけないために、Linux Kernelコード内で定義されたエラー番号を正しく使う事が重要になります。ちなみに、Linux Kernelのエラー番号は、以下の特徴があります。
- FreeBSD Kernelよりもエラー番号が多い事
- Linux Kernel内専用のエラー番号がある事
エラー番号の定義ファイル
エラー番号の定義ファイルは、下表の3種類存在します。それぞれのファイルに定義されたエラー番号の意味も後述します(表の中だけ、である調にします)。
PATH | 内容 |
<KERNEL_TOP>/include/uapi/asm-generic/errno-base.h | ファイル・リソースの基本的なエラー状態を説明するためのエラー番号(1〜34) |
<KERNEL_TOP>/include/uapi/asm-generic/errno.h | errno-base.hで表しきれなかったエラー状態を説明するためのエラー番号(35〜133) |
<KERNEL_TOP>/include/linux/errno.h | Kernel空間のみで使用するエラー番号(512〜518、521〜530) |
<KERNEL_TOP>/include/uapi/asm-generic/errno-base.h | |||
---|---|---|---|
名称 | 値 | 原文 | 和訳 |
EPERM | 1 | Operation not permitted | 許可されていない操作である |
ENOENT | 2 | No such file or directory | ファイルまたはディレクトリが存在しない |
ESRCH | 3 | No such process | 指定されたプロセスが存在しない |
EINTR | 4 | Interrupted system call | シグナル割り込みが発生した |
EIO | 5 | I/O error | 入出力エラーである |
ENXIO | 6 | No such device or address | デバイスまたはアドレスが存在しない |
E2BIG | 7 | Argument list too long | 引数リストが長すぎる |
ENOEXEC | 8 | Exec format error | 実行形式が異常である |
EBADF | 9 | Bad file number | 無効(異常)なファイル番号 |
ECHILD | 10 | No child processes | 子プロセスが存在しない |
EAGAIN | 11 | Try again |
再実行する事(EWOULDBLOCKも同じ番号) |
ENOMEM | 12 | Out of memory | メモリー不足である |
EACCES | 13 | Permission denied | 権限が無い |
EFAULT | 14 | Bad address | 無効なアドレス |
ENOTBLK | 15 | Block device required | ブロックデバイスが必要である |
EBUSY | 16 | Device or resource busy | デバイスまたはリソースは使用中である |
EEXIST | 17 | File exists | ファイルは既に存在する |
EXDEV | 18 | Cross-device link | デバイスをまたぐリンクである |
ENODEV | 19 | No such device | デバイスが存在しない |
ENOTDIR | 20 | Not a directory | ディレクトリではない |
EISDIR | 21 | Is a directory | ディレクトリである |
EINVAL | 22 | Invalid argument | 無効な引数である |
ENFILE | 23 | File table overflow | オープン済ファイル(ファイルディスクリプタ)がシステム上限に達している |
EMFILE | 24 | Too many open files | 開いているファイルが多すぎる |
ENOTTY | 25 | Not a typewriter | TTYではない |
ETXTBSY | 26 | Text file busy | テキストファイルが使用中である |
EFBIG | 27 | File too large | ファイルが大きすぎる |
ENOSPC | 28 | No space left on device | デバイスの空き領域が不足している |
ESPIPE | 29 | Illegal seek | 無効なシークである |
EROFS | 30 | Read-only file system | リードオンリーファイルシステムである |
EMLINK | 31 | Too many links | リンクの数が多すぎる |
EPIPE | 32 | Broken pipe | パイプが壊れている(既にクライアントでcloseされている状態など) |
EDOM | 33 | Math argument out of domain of func | 数値引数が領域外である |
ERANGE | 34 | Math result not representable | 結果が大き過ぎる |
<KERNEL_TOP>/include/uapi/asm-generic/errno.h | |||
---|---|---|---|
名称 | 値 | 原文 | 和訳(補足説明) |
EDEADLK | 35 | Resource deadlock would occur |
リソースデッドロックが発生する見込みである。(EDEADLOCKでも定義されている)Kernel内部のデッドロック検知システムlockdepなどで、デッドロック検知時に使われる。 |
ENAMETOOLONG | 36 | File name too long | ファイル名が長過ぎる |
ENOLCK | 37 | No record locks available | 利用できるレコードロックが無い |
ENOSYS | 38 | Function not implemented | 関数(system call)は実装されていない。本当に関数が存在しないかどうかを判断するために、system callの実装内で、このエラー番号は使うべきでない。 |
ENOTEMPTY | 39 | Directory not empty | ディレクトリーが空ではない |
ELOOP | 40 | Too many symbolic links encountered | シンボリックリンクの回数が多すぎる |
ENOMSG | 42 | No message of desired type | 要求された型のメッセージが無い |
EIDRM | 43 | Identifier removed | 識別子は削除された |
ECHRNG | 44 | Channel number out of range | チャンネル番号が範囲外である |
EL2NSYNC | 45 | Level 2 not synchronized | 同期できていない (レベル2) |
EL3HLT | 46 | Level 3 halted | 停止 (レベル3) |
EL3RST | 47 | Level 3 reset | リセット (レベル3) |
ELNRNG | 48 | Link number out of range | リンク番号が範囲外である |
EUNATCH | 49 | Protocol driver not attached | プロトコルドライバがアタッチされていない |
ENOCSI | 50 | No CSI structure available | CSI構造が利用できない |
EL2HLT | 51 | Level 2 halted | 停止 (レベル2) |
EBADE | 52 | Invalid exchange | 不正な交換である |
EBADR | 53 | Invalid request descriptor | 無効な要求ディスクリプターである |
EXFULL | 54 | Exchange full | 変換テーブルが一杯である |
ENOANO | 55 | No anode | inodeが無い(諸説があるエラー番号) |
EBADRQC | 56 | Invalid request code | 不正なリクエストコードである |
EBADSLT | 57 | Invalid slot | 不正なスロットである |
EBFONT | 59 | Bad font file format | 不正なフォントファイルフォーマットである |
ENOSTR | 60 | Device not a stream | ストリームではない |
ENODATA | 61 | No data available | データが無い |
ETIME | 62 | Timer expired | 時間が経過した(時間による失効) |
ENOSR | 63 | Out of streams resources | ストリームリソースが存在しない |
ENONET | 64 | Machine is not on the network | 装置がネットワーク上に無い |
ENOPKG | 65 | Package not installed | パッケージがインストールされていない |
EREMOTE | 66 | Object is remote | オブジェクトがリモートにある |
ENOLINK | 67 | Link has been severed | リンクが切れている |
EADV | 68 | Advertise error | Advertiseエラー |
ESRMNT | 69 | Srmount error | Srmountエラー |
ECOMM | 70 | Communication error on send | 送信時に通信エラーが発生した |
EPROTO | 71 | Protocol error | プロトコルエラーである |
EMULTIHOP | 72 | Multihop attempted | マルチホップが試みられた |
EDOTDOT | 73 | RFS specific error | RFS特有のエラーである |
EBADMSG | 74 | Not a data message | データメッセージではない |
EOVERFLOW | 75 | Value too large for defined data type | データ型に格納するには値が大きすぎる |
ENOTUNIQ | 76 | Name not unique on network | 名前がネットワークで一意ではない |
EBADFD | 77 | File descriptor in bad state | ファイルディスクリプターが不正な状態である |
EREMCHG | 78 | Remote address changed | リモートアドレスが変わった |
ELIBACC | 79 | Can not access a needed shared library | 必要な共有ライブラリにアクセスできない |
ELIBBAD | 80 | Accessing a corrupted shared library | 壊れた共有ライブラリにアクセスをした |
ELIBSCN | 81 | .lib section in a.out corrupted | .libセクションが壊れている |
ELIBMAX | 82 | Attempting to link in too many shared libraries | リンクしようとした共有ライブラリが多過ぎる |
ELIBEXEC | 83 | Cannot exec a shared library directly | 共有ライブラリを直接実行できなかった |
EILSEQ | 84 | Illegal byte sequence | 不正なバイト列である |
ERESTART | 85 | Interrupted system call should be restarted | 中断システムコールは再起動が必要である |
ESTRPIPE | 86 | Streams pipe error | ストリームパイプエラー |
EUSERS | 87 | Too many users | ユーザー数が多過ぎる |
ENOTSOCK | 88 | Socket operation on non-socket | ソケットではない |
EDESTADDRREQ | 89 | Destination address required | 宛先のアドレスが必要 |
EMSGSIZE | 90 | Message too long | メッセージが長過ぎる |
EPROTOTYPE | 91 | Protocol wrong type for socket | ソケットに指定できないプロトコルタイプである |
ENOPROTOOPT | 92 | Protocol not available | 利用できないプロトコルである |
EPROTONOSUPPORT | 93 | Protocol not supported | 未対応のプロトコルである |
ESOCKTNOSUPPORT | 94 | Socket type not supported | 未対応のソケットタイプである |
EOPNOTSUPP | 95 | Operation not supported on transport endpoint | トランスポートエンドポイントで未対応の操作 |
EPFNOSUPPORT | 96 | Protocol family not supported | 対応していないプロトコルファミリーである |
EAFNOSUPPORT | 97 | Address family not supported by protocol | 対応していないアドレスファミリーである |
EADDRINUSE | 98 | Address already in use | アドレスは既に使用されている |
EADDRNOTAVAIL | 99 | Cannot assign requested address | アドレスが使用できない |
ENETDOWN | 100 | Network is down | ネットワークは不通である |
ENETUNREACH | 101 | Network is unreachable | ネットワークは到達不能である |
ENETRESET | 102 | Network dropped connection because of reset | リセットでネットワーク接続が失われた |
ECONNABORTED | 103 | Software caused connection abort | ソフトウェア要求により接続は中止された |
ECONNRESET | 104 | Connection reset by peer | 接続は相手からリセットされた |
ENOBUFS | 105 | No buffer space available | バッファーは容量不足である |
EISCONN | 106 | Transport endpoint is already connected | トランスポートエンドポイントは既に接続されている |
ENOTCONN | 107 | Transport endpoint is not connected | トランスポートエンドポイントは接続されていない |
ESHUTDOWN | 108 | Cannot send after transport endpoint shutdown | トランスポートエンドポイントはシャットダウン中であり送信できない |
ETOOMANYREFS | 109 | Too many references: cannot splice | 処理限界を超える多重参照である |
ETIMEDOUT | 110 | Connection timed out | 操作はタイムアウトした |
ECONNREFUSED | 111 | Connection refused | 接続は拒否された |
EHOSTDOWN | 112 | Host is down | ホストはダウンしている |
EHOSTUNREACH | 113 | No route to host | ホストに到達不能である |
EALREADY | 114 | Operation already in progress | 操作は既に実行中である |
EINPROGRESS | 115 | Operation now in progress | 操作は現在実行中である |
ESTALE | 116 | Stale NFS file handle | NFSファイルハンドルが古い |
EUCLEAN | 117 | Structure needs cleaning | 構造のクリーニングが必要である |
ENOTNAM | 118 | Not a XENIX named type file | XENIX名前付きファイルではない |
ENAVAIL | 119 | No XENIX semaphores available | XENIXセマフォは利用できない |
EISNAM | 120 | Is a named type file | 名前付きファイルである |
EREMOTEIO | 121 | Remote I/O error | リモートI/Oエラーである |
EDQUOT | 122 | Quota exceeded | クォータ超過である |
ENOMEDIUM | 123 | No medium found | メディアが見つからない |
EMEDIUMTYPE | 124 | Wrong medium type | 間違ったメディアタイプである |
ECANCELED | 125 | Operation Canceled | 処理はキャンセルされた |
ENOKEY | 126 | Required key not available | 要求された鍵が利用できない |
EKEYEXPIRED | 127 | Key has expired | 鍵の期限が切れた |
EKEYREVOKED | 128 | Key has been revoked | 鍵が無効となった |
EKEYREJECTED | 129 | Key was rejected by service | 鍵がサーバーにより拒否された |
EOWNERDEAD | 130 | Owner died | 所有者が死亡した |
ENOTRECOVERABLE | 131 | State not recoverable | 状態は回復不能である |
ERFKILL | 132 | Operation not possible due to RF-kill | RF-killのため操作できない |
EHWPOISON | 133 | Memory page has hardware error | メモリページはHWエラーがあります。 |
<KERNEL_TOP>/include/linux/errno.h | |||
---|---|---|---|
名称 | 値 | 原文 | 和訳(補足説明) |
ERESTARTSYS | 512 |
(無し) |
system callが再起動可能である事を示す |
ERESTARTNOINTR | 513 | (無し) | systemcallを必ず再実行する |
ERESTARTNOHAND | 514 | restart if no handler. | ハンドラが無ければ再実行する |
ENOIOCTLCMD | 515 | No ioctl command | ioctl() が存在しない |
ERESTART_RESTARTBLOCK | 516 | restart by calling sys_restart_syscall | sys_restart_syscall()によって、再実行する |
EPROBE_DEFER | 517 | Driver requests probe retry | ドライバはprobe(探査、初期化)の再実行を要求している |
EOPENSTALE | 518 | open found a stale dentry |
古いdentryを発見した(Openした) |
EBADHANDLE | 521 | Illegal NFS file handle | 不正なNFSファイルハンドラである |
ENOTSYNC | 522 | Update synchronization mismatch | 更新同期の不一致である |
EBADCOOKIE | 523 | Cookie is stale | Cookieが古い |
ENOTSUPP | 524 | Operation is not supported | その操作はサポートしていない |
ETOOSMALL | 525 | Buffer or request is too small | バッファかリクエストが小さすぎる |
ESERVERFAULT | 526 | An untranslatable error occurred | 翻訳(変換)できないエラーが発生した |
EBADTYPE | 527 | Type not supported by server | サーバによって、その型がサポートされていない |
EJUKEBOX | 528 | Request initiated, but will not complete before timeout | リクエストは開始されたが、タイムアウトまでに完了しなかった |
EIOCBQUEUED | 529 | iocb queued, will get completion event | iocbがキューに入れられ、完了イベントが取得される |
ERECALLCONFLICT | 530 | conflict with recalled state | 再呼び出し状態での衝突である |
補足:User空間でKernel空間のエラー番号を見る方法
User空間には、Kernel空間のエラー番号を示すerrnoが存在します。以下にerrnoに関するMANページ情報を引用します。
ヘッダーファイル <errno.h> で整数型の変数 errno が定義されており、 システムコールやいくつかのライブラリ関数は、エラーが発生した際に この変数にその原因を示す値を設定する。 この値は呼び出しの返り値がエラー (ほとんどのシステムコールでは -1 で、ほとんどのライブラリ関数では -1 か NULL) を示したときに のみ意味を持つが、ライブラリ関数は成功した場合も errno を変更することが許されている。
有効なエラー番号はいずれも 0 以外の値を持つ。 どのシステムコールもライブラリ関数も errno を 0 に設定することはない。
この変数errnoの取り扱いで、注意すべきポイントが2つあります。
- 関数コール前にerrnoを初期化(エラー番号をセット後、その番号を保持し続けるため)
- 関数コール後にerrno値を別変数にコピー(errnoは一つしかなく、書き換わる可能性があるため)
以下に、存在しないファイルをOpenしようとし、エラーが発生するサンプルプログラム(および実行結果)を示します。プログラム中で使用している関数perror()は、変数errnoに格納されたエラー番号とメッセージを対応付け、メッセージを標準エラー出力に書き出します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <stdio.h> #include <errno.h> int main(void){ FILE *fp = NULL; char fname[] = "no_exist_file.txt"; /* 存在しないファイル */ int err = 0; /* お作法:関数呼び出し前、既にerrnoが設定されている可能性があります。 * errnoを確認する場合は、事前初期化をします。 * (今回の例では、fopen()前に関数がないので、本当は不要)*/ errno = 0; fp = fopen(fname, "r"); if(NULL == fp) { /* お作法:errnoは書き換えられる可能性があるため、 * ローカル変数にコピー。(今回の例では、本当は不要な処理)*/ err = errno; perror(NULL); /* エラーを説明する文章を出力 */ printf("Error No. = %d\n", err); return -1; } fclose(fp); return 0; } |
1 2 3 4 |
$ gcc -o test test.c $ ./test No such file or directory Error No. = 2 |
ロシア人と国際結婚した地方エンジニア。
小学〜大学院、就職の全てが新潟。
大学の専攻は福祉工学だったのに、エンジニアとして就職。新卒入社した会社ではOS開発や半導体露光装置ソフトを開発。現在はサーバーサイドエンジニアとして修行中。HR/HM(メタル)とロシア妻が好き。サイトに関するお問い合わせやTwitterフォローは、お気軽にどうぞ。
1件の返信
[…] Linux Kernel: prink(print kernel)によるメッセージ出力 […]