APUE Memo

Chapter. 7 プロセスの環境

プロセス制御の基本の前に単一プロセスの環境について

7.2 関数 main

7.3 プロセスの終了

正常終了

  1. main から戻る
  2. exit を呼ぶ
  3. _exit_Exit を呼ぶ
  4. スレッドの開始ルーティンの最後のスレッドから戻る (11.5 節)
  5. 最後のスレッドから pthread_exit を呼ぶ (11.5)

異常終了

  1. abortを呼ぶ 10.17
  2. シグナルを受け取る 10.2
  3. キャンセル要請に対する最後のスレッドの応答 11.5, 12.7

とりあえず 11,12章まではスレッドがらみの終了については無視

exit 関数群

atexit 脱出ハンドラ

7.4 コマンドライン引数

7.5 環境リスト

env コマンドの簡単な実装

#include <stdio.h>
extern char** environ;
int main(int argc, char *argv[]) {                                                                                               
  char **envp = environ;
  while ( *envp )
    printf("%s\n", *envp++);
}

7.6 C プログラムのメモリ配置

スタック  --- 高位アドレス
   |
   v

   ^
   |
 ヒープ
  BSS   --- exec が 0 に初期化
 データ
テキスト --- 低位アドレス

7.7 共有ライブラリ

7.8 メモリ割付

3つの関数が返すポインタは任意のオブジェクト対して使用できる適切なアラインメントである. 例. あるシステムで double は 8の倍数のメモリ位置から始まるのであれば、そのようなアライメントになるということ

7.9 環境変数

Todo

7.10 setjmp と longjmp 関数

7.11 getrlimit と setrlimit 関数* 非ローカルのgoto

自動変数はどうなるの?

以下の2つには影響あり。

setjmp の頃に戻るか、longjmp の直前に戻るかは処理系に依存する

TODO: jmp_buf には何が入っている?

7.11 getrlimit と setrlimit 関数

各プロセスについて、資源の利用制限

どういう資源?

RLIMIT_AS プロセスの全使用可能メモリの最大サイズ(バイト単位)

RLIMIT_DATA データセグメントの最大サイズ 初期データ・非初期化データ・ヒープの総和

RLIMIT_RSS resident set size プロセスが実際に使用している物理メモリ量

RLIMIT_STACK スタックの最大サイズ

演習

7.1 printf の戻り値が返った。 7.2 exit から呼ばれる fclose での flush 後 対話的なら行バッファリングなので、改行後。ファイルにリダイレクトされているなら、完全バッファリングなので、標準入出力の後始末のとき。 7.3 ない 7.4 null ポインタとして使えるように終端を与える。 7.5 スキップ 7.6 calloc なら0フィルなので、どちらも初期化される →0に初期化するが、ISO Cだとこの0が浮動小数のゼロかnull ptrかは保証しない。 7.7 ヒープやスタックが必要になるのは実行時だから 7.8 アライメントが必要だから →デバッグ用のシンボルテーブルがあるから。strip コマンドでなくせる。 7.9 共有ライブラリのに必要な全てのコードがリンクされるから →大部分が標準入出力ライブラリに閉められるから 7.10 val が 0 以外なら不正。