システムプログラム練習問題#2

練習問題(201)

文字列のところにあるプログラムを変更し,文字列定数の内容を変更すると,セグメンテーションフォルトが発生することを確かめよ.

また,cc のオプションに -fwritable-strings を与えると文字列定数の内容を変更が可能になることも確かめよ.

練習問題(202)

標準入出力を用いるライブラリ関数のところにある fgets,puts を用いたプログラムの LINE_LEN を 5 にして,コンパイル実行すると以下のような結果になってしまう. どうしてこのような結果になってしまうのか,その理由を調べよ.

% ./a.out [←]
1234567890[←]
1234
5678
90

abcdefg[←]
abcd
efg

[C-D]
%

練習問題(203)

文字列の中に含まれる単語の数を数える関数 wc を作成し,main 関数から wc 関数をいくつかの文字列を引数に呼び出し,wc 関数が正しく動くことを確かめなさい. 単語はスペースで区切られているものとするが,区切り文字を任意に引数として与えることができるようにしても良い.

練習問題(204)

文字,文字列の検索のところにあるプログラムは,先頭に / がある場合や末尾が / で終わる場合をうまく扱えず,実行結果は次のようになってしまう.

% ./a.out [←]
/dir1/dir2/dir3/file[←]
0:
1: dir1
2: dir2
3: dir3
4: file

dir0/dir2/dir3/[←]
0: dir0
1: dir2
2: dir3
3:

[C-D]
%

先頭の / はパスの構成要素と認識され上の最初の例では 0: のところに / が出力されるように,また末尾の / は無視され上の次の例では 3: が出力されないように,変更せよ.

練習問題(205)

strlcpy, strdup と同じ動作をする関数 my_strlcpy, my_strdup を作成せよ. main 関数から strlcpy, my_strlcpy および strdup, my_strdup のそれぞれに同じ引数をいくつかのパターンで与えるプログラムも作成し,同じように動作していることを確かめなさい.

メモリリークを起こさないようにする練習として,malloc や strdup などを用いてヒープ領域に確保したメモリ領域は必ず明示的に free すること.

練習問題(206)

strcmp, strcasecmp と同じ動作をする関数 my_strcmp, my_strcasecmp を作成せよ. main 関数から strcmp, my_strcmp および strcasecmp, my_strcasecmp のそれぞれに同じ引数をいくつかのパターンで与えて,同じように動作していることを確かめなさい.

練習問題(207)

strlen と同じ動作をする関数 my_strlen1, my_strlen2 を作成せよ. my_strlen1 は単純なプログラムとし,my_strlen2 は工夫されたプログラムとする. my_strlen2 を my_strlen1 よりも20%程度は高速なものにしなさい. 関数の実行時間は,関数呼び出しの前後に clock (3) を呼び出すことで,計測することができる. この時,非常に長い文字列を引数として渡し,必要ならば複数回関数を呼び出し,my_strlen1を少なくとも1秒程度実行するように調節すること. また,LinuxまたはMac OS X付属ライブラリの strlen の実行時間との比較も行うこと.

練習問題(208)

以下のように,シェルのように1行入力を受け取り,コマンド名と入力のリダイレクション記号「<」があればその後のファイル名を表示し,そうでなければ入力として console と出力するプログラムを作りなさい. 入力行は,コマンド名だけ,または「コマンド名 < ファイル名」(< の前後にスペース1つ)という形式だけに対応すればよい.

% ./a.out [←]
command[←]
command name: command
input: console
command < file[←]
command name: command
input: file
%

メモリリークを起こさないようにする練習として,malloc や strdup などを用いてヒープ領域に確保したメモリ領域は必ず明示的に free すること.

練習問題(209)

練習問題(208)のプログラムを変更し,出力のリダイレクション記号「>」およびパイプ記号「|」にも対応できるようにせよ. リダイレクション記号の出現順序は,「<」の後に出力「>」が現れる場合にのみ対応すればよい. また,パイプ記号は1つ現れる場合にのみ対応すればよい. パイプ記号が現れる場合は,パイプ記号の前後のそれぞれのコマンドについて,入出力先が表示されるようにする.

練習問題(210)

練習問題(209)のプログラムを変更し,

  1. 異なるリダイレクション記号の出現順序が変わっても対応できるように
  2. 同じリダイレクション記号が複数出てきたらエラーメッセージが出力されるように
  3. スペースがコマンド,リダイレクション記号,ファイル名の周りに入っていなくても,または複数個入っていても,同じように処理できるように
しなさい.

上記の場合に対応できていることを示す実行結果をつけること.