#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文は親プロセスに終了ステータスを返すという事です。



