apue第七章プロセス環境ノート


7.2 atexit関数の登録
コードを見てください:
#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つのエネルギーは深層ネスト関数で発生する処理エラーに対して非常に有用である.