明らかに、それは良い習慣です。それは言うまでもない。サンプルコードで毎回見ます(いくつか例を挙げるsocket()
と、 、fork()
、またはmalloc()
など)。私はそれをすることを知っています、私はそれの理由をあまり理解していません. 彼らは頻繁に失敗する傾向がありますか? システムコールがカーネルモードで行われているためですか?その背後にある理由は何ですか?
3 に答える
これらのルーチンを呼び出すコードが結果をチェックしてエラーが発生したかどうかを判断する理由を尋ねていると思います。
引用した各ルーチン、socket
、fork
、およびmalloc
にはリソースが必要です。これらのリソースは、呼び出しプロセスがシステム管理者またはユーザーによって設定された制限を超えたか、またはシステムが所有するリソースを使い果たし、それ以上プロセスに提供できないために利用できない場合があります。したがって、頻繁ではないにしても、これらのルーチンのいずれかを呼び出すと、失敗が返される可能性があります。したがって、呼び出しプロセスは失敗をチェックする必要があります。
さらに、一部の実装では、操作が完了する前にシグナルがプロセスに配信されると、一部のシステム ルーチン ( や などread
)write
が中断される場合があります。(シグナルが到着すると、それは重要であると見なされ、潜在的に長い操作が完了するのを待つのではなく、すぐにプロセスに配信することが望ましいです。したがって、操作が中断され、シグナルが配信され、プロセスがシグナルを処理する場合があります。その後、制御は元のルーチンを呼び出したコードに返され、そのコードには、操作が中断されたことを通知する必要があります。) この中断の結果、操作が中断されたことを示すエラー ステータスと共に失敗が返されます。
例:
FILE *fp;
fp = fopen("c:\\removedDirectory\nonexistingFile.txt", "r")//returns NULL
if(fp != NULL)
{
//stuff here will fail if fp == NULL
}
fopen の出力をチェックせず(エラーを返す関数に置き換えます)、fp
NULL の場合、実際のファイル ストリームに依存する後続の関数は機能しません。