Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxのerrno基本チュートリアルを使う

Linuxのerrno基本チュートリアルを使う

  

LinuxのC api関数に異常があると、errno変数(errno.hを含む)には通常整数値が割り当てられます。異なる値は異なる意味を表します。値推測の理由は、実際のプログラミングでは、このトリックが説明不可能なように思われる多くの問題を解決したためです。しかし、errnoは数値、つまりマクロ定義を読むためのerrno.hの具体的な意味であり、それぞれの検索は非常に面倒なものです。 (1)void perror(const char * s)関数の説明perror()は、前の関数のエラーを標準エラー(stderr)に出力するために使用されます。パラメータsは次のとおりです。文字列が最初に表示され、その後にエラー理由文字列が続きます。このエラーの原因は、グローバル変数errnoの値に従って出力されるストリングです。 (2)char * strerror(int errno)は、エラーコードを文字列エラーメッセージに変換します。このエラーメッセージは、fprintf(stderr、CreateProcess%sの" Process ID%)などのユーザーインターフェイスに出力される情報と組み合わせることができます。注:processIDは、取得した整数ID(3)printf( "%m"、errno)であるとし、さらに、エラー発生時にすべての箇所でエラーが発生するとは限らない。次のコードスニペットなどのエラーコードを取得します。*ブログバスの山括弧はhtml記号として扱われるため、次のヘッダーファイルでは山括弧を直接使用する代わりに"を使用します。 * /#include "stdio.h" #include "stdlib.h" #include "errno.h" #include "netdb.h" #include "sys /types.h" #include "netinet /を無視するIn.h< int main(int argc、char * argv []){struct hostent * h; if(argc!= 2){fprintf(stderr、"使用法:getip address \\ n"); exit(1); } /*ホスト情報を取得* /if((h = gethostbyname(argv [1]))== NULL){/* gethostbynameが失敗すると、エラーメッセージが表示されます* /herror(< gethostbyname>;); exit(1);} /*印刷プログラムによって取得される情報* /printf('ホスト名:%s \\ n'、h->; h_name); printf(< '> IPアドレス:%s \\ n'、inet_ntoa(*((struct in_addr *)h-> h_addr))); return 0;}

/**** ********************************* /あなたは上記のコードを通して見ることができます:gethostbyname()関数を使って、あなたはできませんエラーメッセージはerrnoではなくh_errnoに格納されるため、エラーメッセージを出力するにはperror()を使用してください。そのため、herror()関数を呼び出す必要があります。単純にgethostbyname()にマシン名(< bbs.tsinghua.edu.cn>)を渡してから、返された構造体hostentからIPとその他の情報を取得するだけです。 h-> h_addrはchar *ですが、inet_ntoa()関数はstruct in_addr構造体を渡す必要があります。したがって、上記のh-> h_addrはstruct in_addr *にキャストされ、それからすべてのデータが取得されます。


errno.hで定義されているエラーコード値は次のとおりです。

エラーコードerrnoの確認はプログラムをデバッグするための重要な方法です。 linuc C api関数で例外が発生した場合、通常、errno変数(errno.hを含む)には整数値が割り当てられます値が異なると、意味が異なることもあります。実際のプログラミングでは、このトリックは説明不可能と思われる多くの問題を解決しました。もっと厄介なのは、エラーコードの意味を見つけるためにLinuxのソースコードに行き、それを貼り付けるたびに、後でそれをチェックする必要があるということです。以下はLinux 2.4.20-18のカーネルコードからのものです。/usr/include/asm/errno.h#ifndef _I386_ERRNO_H #define_I386_ERRNO_H #define EPERM 1 /*操作不可* /#define ENOENT 2 /*このようなファイルはありません。ディレクトリ* /#define ESRCH 3 /*そのようなプロセスは存在しない* /#define EINTR 4 /*中断されたシステムコール* /#define EIO 5 /* I /Oエラー* /#define ENXIO 6 /*そのようなデバイスまたはアドレスは存在しない* /#define E2BIG 7 /*引数リストが長すぎます* /#define ENOEXEC 8 /*実行フォーマットエラー* /#define EBADF 9 /* define ECHILD 10 /* define子プロセスはありません* /#define EAGAIN 11 /*再試行* /#define ENOMEM 12 /*メモリ不足* /#define EACCES 13 /*パーミッション拒否* /#define EFAULT 14 /*不正なアドレス* /#define ENOTBLK 15 /*ブロックデバイスが必要* /#define EBUSY 16 /*デバイスまたはリソースがビジーです* /#define EEXIST 17 /*ファイルが存在します* /#define EXDEV 18 /*デバイス間リンク* /#define ENODEV 19 /*このようなデバイスはありません* /#define ENOTDIR 20 /*未定義ディレクトリ* /#define EISDIR 21 /*ディレクトリです* /#define EINVAL 22 /*無効な引数* /#define ENFILE 23 /*ファイルテーブルのオーバーフロー* /#define EMFILE 24 /*オープンファイルが多すぎる* /#define ENOTTY 25 /*タイプライターではない* /#define ETXTBSY 26 /*テキストファイルがビジー状態* /#define EFBIG 27 /* File大きすぎる* /#define ENOSPC 28 /*デバイスに空きスペースがない* /#define ESPIPE 29 /*違法なシーク* /#define EROFS 30 /* read-onlyファイルシステム* /#define EMLINK 31 /*リンクが多すぎる* /#define EPIPE 32 /*壊れたパイプ* /#define EDOM 33 /* funcの範囲外の数学の引数* /#define ERANGE 34 /*表現できない数学の結果* /#define EDEADLK 35 /*リソースのデッドロックが発生する* /#define ENAMETOOLONG 36 /*ファイル名が長すぎます* /#define ENOLCK 37 /*レコードロックは使用できません* /#define ENOSYS 38 /*機能未実装* /#define ENOTEMPTY 39 /*ディレクトリが空ではない* /#define ELOOP 40 /*シンボリックリンクが多すぎる* /

Copyright © Windowsの知識 All Rights Reserved