apue第七章プロセス環境ノート
1670 ワード
7.2 atexit関数の登録
コードを見てください:
出力:
allen@allenPC:~/code/apuecode$ ./a.out main is done exit2 exit1
7.5環境表
プログラムごとに環境テーブルが受信されます.getenvは次のように取得できます.
例:
allen@allenPC:~/code/apuecode$ ./a.out OS TERM HOME get TERM env is xterm get HOME env is/home/allen
7.6 Cプログラムのストレージスペースレイアウト
プログラムの論理レイアウト:
1)本文セグメント:CPUが実行する機器指令部.共有可能
2)初期化データセグメント:プログラムに明示的に初期値を付与する必要があることを含む.
3)非初期化データセグメント.プログラムが実行する前に、カーネルはこのセグメントのデータを0またはnullに初期化する.任意の関数の外に表示されるc宣言:long sum[1000]
4)スタック
5)ヒープ
プログラムに配置する必要があるセグメント:本文セグメントと初期化データセグメント
7.7共有ライブラリ
7.8メモリの割り当て
freeが解放する空間は、通常、利用可能なメモリプールに送り込まれる.
mallocが割り当てる空間は要求より大きい.追加のスペースは、管理情報を記録するために使用されます.次の割り当て可能なブロックへのポインタを指します.
7.10 setjmp longjmp
cにおけるgotoは関数を越えられない.上記の2つのエネルギーは深層ネスト関数で発生する処理エラーに対して非常に有用である.
コードを見てください:
#include
#include
static void exit1(){
printf("%s
", __FUNCTION__);
}
static void exit2(){
printf("%s
", __FUNCTION__);
}
int main(){
if (atexit(exit1) != 0 || atexit(exit2) != 0){
printf("register exit faield
");
exit(1);
}
printf("%s is done
", __FUNCTION__);
}
出力:
allen@allenPC:~/code/apuecode$ ./a.out main is done exit2 exit1
7.5環境表
プログラムごとに環境テーブルが受信されます.getenvは次のように取得できます.
#include
#include
#include
int main(int arg, char** argc){
if (arg < 2){
printf("usage env
");
exit(1);
}
for (int i = 1; i < arg; ++i){
char* res = getenv(argc[i]);
if (NULL != res){
printf("get %s env is %s
", argc[i], res);
}
}
exit(0);
}
例:
allen@allenPC:~/code/apuecode$ ./a.out OS TERM HOME get TERM env is xterm get HOME env is/home/allen
7.6 Cプログラムのストレージスペースレイアウト
プログラムの論理レイアウト:
1)本文セグメント:CPUが実行する機器指令部.共有可能
2)初期化データセグメント:プログラムに明示的に初期値を付与する必要があることを含む.
3)非初期化データセグメント.プログラムが実行する前に、カーネルはこのセグメントのデータを0またはnullに初期化する.任意の関数の外に表示されるc宣言:long sum[1000]
4)スタック
5)ヒープ
プログラムに配置する必要があるセグメント:本文セグメントと初期化データセグメント
7.7共有ライブラリ
7.8メモリの割り当て
freeが解放する空間は、通常、利用可能なメモリプールに送り込まれる.
mallocが割り当てる空間は要求より大きい.追加のスペースは、管理情報を記録するために使用されます.次の割り当て可能なブロックへのポインタを指します.
7.10 setjmp longjmp
cにおけるgotoは関数を越えられない.上記の2つのエネルギーは深層ネスト関数で発生する処理エラーに対して非常に有用である.