演習4

1. データのライフサイクルに関連する関数の呼び出し順序(1)

~/fedora/coreutils-*/src/sort.c中でrandread_sourceという名前の構造体型が使われている。その使われ方を読んで randread_source構造体の構築関数、操作関数、破壊関数の名前を延べよ。またそれらの呼び出し順が

  1. 構築関数
  2. 操作関数
  3. 破壊関数

になっていることを確認せよ。

2. データのライフサイクルに関連する関数の呼び出し順序(2)

~/fedora/coreutils-*/src/wc.c中でというargv_iterator名前の構造体型が使われている。その使われ方を読んで argv_iterator構造体の構築関数、操作関数、破壊関数の名前を延べよ。またそれらの呼び出し順が

  1. 構築関数
  2. 操作関数
  3. 破壊関数

になっていることを確認せよ。

3. データのライフサイクルに関連する関数の呼び出し順序(3)

~/fedora/coreutils-*/src/chcon.c中のcompute_context_from_mask関数にてcontext_t型が使われている。この型の定義はどこにあるか。また構築関数、操作関数、破壊関数の名前を延べよ。

4. 関数ポインタの単純な利用の例

coreutils-*/lib/exclude.c中のexclude_fnmatchにて関数ポインタを活用している箇所があります。関数ポインタがどのように活用されているかを説明して下さい。関数ポインタが指し示す関数の意味などの詳細について調べる必要はありません。

5. コールバック関数呼び出し箇所の特定

  1. manページを読んでbsearch関数について調べよ。
  2. glibc中からbsearchの定義を探せ。
  3. コールバック関数呼び出し行を特定せよ。

6. 追加の引数の活用箇所

coreutils-*/src/install.c 中のprocess_dir関数中で、make_dir_parents関数を呼び出しています。ここで make_ancestor関数がコールバック関数として渡されています。またoptionsという変数も同様に渡されています。

一方同じファイルに定義された make_ancestor関数を読むと options という名前の第三引数をとっています。これは「追加の引数」の引数の例です。

make_dir_parents関数の定義を調べ、make_dir_parents関数を呼び出すときに渡した引数が、コールバック関数make_ancestorへ引き渡されていることを確認して下さい。

7. コールバック関数群とその選択経緯の調査

tcpdumpパッケージに含まれるtcpdumpというコマンドがあります。このツールを使うとネットワークのパケットを記録、デコードできます。

例えば以下は、wgetでウェブページ(URL:http://localhost/)をとってきた例です。(資料表示のために1行をバックスラッシュで区切って、複数の行に分けています。)

# tcpdump -r /tmp/lab4_1_1.pcap
reading from file /tmp/lab4_1_1.pcap, link-type EN10MB (Ethernet)
11:27:51.168464 IP6 localhost.60352 > localhost.http: \
     Flags [P.], seq 45832920:45833052, ack 3902981250, win 342, \
     options [nop,nop,TS val 29689158 ecr 29689158], length 132: \
     HTTP: GET / HTTP/1.1
11:27:51.173074 IP6 localhost.http > localhost.60352: \
     Flags [P.], seq 1:475, ack 132, win 350, \
     options [nop,nop,TS val 29689162 ecr 29689158], length 474: \
     HTTP: HTTP/1.1 403 Forbidden

デコードの結果が気にいらないので、改造しようとしていると考えて下さい。

  1. tcpdumpのソースコードを入手して下さい。Fedora付属のものでも、アップストリームの
    ものでもかまいません。
  2. “HTTP: ...” の部分の文字列の出所を特定してください。
  3. 特定した箇所が呼び出された経緯をできる限り追跡して下さい。

8. 番外編 アルゴリズムの解明

cat コマンドを含む util-linux パッケージには、 cat コマンドと逆の動作をする tacというコマンドが含まれています。特にオプションを指定しないと、 tac コマンド は引数で与えたファイルを1行毎に ファイル末尾から順番にファイル先頭まで表示します。

[yamato@master]/tmp% cat /tmp/input
ABC
EFG
HIJ

[yamato@master]/tmp% tac /tmp/input
HIJ
EFG
ABC
  1. あなたなら tac コマンド をどう実装するか検討して下さい。
  2. tac コマンド の ソースコードを読み、実装を説明して下さい。
  3. 性能上、あなたの検討した方法と現実の実装を比較して下さい。性能には、実行に要する時間やメモリの使用量があります。