#0x01:unix C programing

Posted by oohara Mon, 30 Jul 2007 08:24:00 GMT

これから数回に渡って、unix環境でのC言語programingについての一口メモをつらつらと書いていきたいと思いマス。

今回はreturnについてです。

Hello,World!

まず最初に示すのはお約束のプログラム(hello.c)です。

このプログラムはHello,World!と表示し、111を返します。 でもこの111はどこに返されるのでしょうか?

#include <stdio.h>
int main() {
   printf("Hello,World!\n");
   return 111;
}

これをgccでビルドし、実行すると以下の様になります。

$ gcc hello.c
$ ./a.out
Hello,World!
$

a.outの実行過程

シェル上からプログラムa.outを起動すると、メモリー上に実行可能プログラムがロードされて、シェルを親とする子プロセスとしてa.outが開始されます。

a.outが開始されるとmain関数が呼び出され、printf文によってHello,World!と表示を行い、return文によってmain関数の呼び出し元に111を返します。

main関数を呼び出すのはビルド時にリンクされるcrt1.oというオブジェクトファイル中の_startルーチンです。 なのでreturn文によって111が_startに返されます。

_startは返された111を引数としてシステムコールexit(111)を呼び出し、親プロセスであるシェルに終了ステータス111が返されます。

終了ステータス

bashには終了ステータスを確認する為の$?という特殊変数があり、それを用いて先ほどのa.outの終了ステータスを確認してみます。

$ ./a.out; echo $?
Hello,World!
111
$

上の結果からa.outは終了ステータスとして111を親プロセスであるシェルに返している事がわかります。

つまりmain関数内のreturn文は親プロセスに終了ステータスを返すという事です。

Posted in  | Tags ,