SIMH で「UNIXプログラミング環境」を読む

シミュレータ SIMH 上で動く UNIX version 7 on PDP-11 を使って「UNIXプログラミング環境」(Kernighan, B.W. & Pike, R. (1984))を読み進める試みを紹介し、現在の FreeBSD との比較を踏まえて変更点を示します。

なお、SIMH は FreeBSD/amd64 5.2.1-RELEASE にインストールしました。ページ数を参照している場合、英語版原著のページ数を指しています。

この文書は2004年度夏学期全学自由ゼミナール「『UNIXプログラミング環境』アップデート」における中間発表(2004年12月16日)の資料として作成しました。

SIMH のインストール

SIMH は The Computer History Simulation Project の手によるフリーのシミュレータです。ここでは PDP-11 をシミュレートし、その上で UNIX version 7 の software kit を動かします。

具体的な手順については、基本的に Masa's WebPageUNIX version 7 on PDP-11 on simh に従ってください(「カーネルの再生成までの手順」はおそらく不要)。ただし、この文書は V2.9-9 について書かれているのでそのままでは上手くいかない部分があります。最新版は V3.3-0 (2004年12月16日現在) で、この文書ではこれを使うことにします。最低限必要な修正点は次の1点だけです。

  1. UV7 の1行目、18b を U18 に変更する

これはメジャーバージョンアップによる仕様変更の影響だと思われます。

個人的に引っかかった点なども記しておきます。

第1章 UNIX for Beginners を読む

非常に単調にはなりますが、気付いたことの羅列のみとします。

p.3: mail

mail コマンドで新しいメールが無い場合、現在は No mail for user というメッセージが出る。

p.7: @ & #

Excercise 1-1 では、現在では @ に相当する Ctrl-u の段階で行が消えてしまう。

Excercise 1-2 では、$ \#date の入力後 #date: not found と返されるはず。

DELETE キーは現在の環境で基本的に Ctrl-c 相当。

p.9: write

現在、write コマンドは標準では permission が無いので一般ユーザは実行できない。

p.10: news

現在 news コマンドは無い。

p.11: learn & teach

現在 learn コマンドは無い。

teach コマンドは共に存在しない。

p.13: ls

現在は標準でグループ名も表示するようになっている。

-l オプションを付けた場合に1行目に表示される数字の大きさが現在は2倍になっている。この数字は表示しているファイル群が占めるディスク領域の大きさを表しているが、ls のソースを覗いた所、V7 は決め打ちで 512byte を1単位としている。現在は標準で 1024byte が1単位だが、オプションで変えられる。1ファイルが最低限占める領域がシミュレータでは 512byte、使用したマシンでは 2048byte のようだ。

なお、ls のソースは /PDP-11/Trees/V7/usr/src/cmd/ls.c といったパスで検索すればインターネットで入手できる。

p.14: ls -l -t

記載通り V7 では ls -l -t という使い方はできないが、現在はできるようになっている。

p.19: sort +n

+n というオプションは現在 man に載っていないが、互換性維持のためか使うことはできる。現在では機能的に -k(ey) オプションがこれに相当するが、これが 1 origin なのに対して、+n は 0 origin である。

p.22: home directory

現在では、ホームディレクトリは /usr/you ではなく /usr/home/you に置かれる。ここで使っている SIMH の場合 root で作業しているのでこのような概念は無い。

p.23: directories

V7 on SIMH では、挙げられているディレクトリのほかに dead.letter など8つのディレクトリがある。また、現在では unix ディレクトリは存在しない。

p.25: who & games

who コマンドは現在では /bin/who ではなく /usr/bin/who に置かれている。

Excercise 1-3 で /usr/games の内容を見ているが、V7 と現在で共通しているのは次のわずか3種だけである。(参考: Plamo Linux FAQ - BSD由来のテキスト版ゲーム集は?)

p.33: background process

コマンドライン入力末尾に & を付けてバックグラウンドでコマンドを実行する際、現在はプロセスIDに加えてその前にジョブ番号が [] に囲まれて表示される。

p.34: PIDs & ps

パイプで繋いだときにプロセスIDが1つしか表示されないとあるが、現在では全てのプロセスIDが表示される。

ps の -g オプションは用途不明。現在の出力には STAT も入る。

V7 on SIMH で ps を使おうとすると Can't open /dev/swap と怒られる場合、ln /dev/rl0 /dev/swap とすればよい。(??)

p.35: at

現在では標準状態で at を一般ユーザが使うことはできない。使う場合には /var/at/at.allow (or at.deny) に設定する必要がある。

参考文献