第16回 V7から始めるUNIX講座 復習とまとめ(システムコール落穂拾い)

第16回 V7から始めるUNIX講座(システムコール落穂拾い)

今回で16回目になります、早いものです。
ずいぶん続きましたが、諸事情により、第16回でいったん区切りとさせて頂く事になりました。
私自身も非常に勉強になりました、まごろくさん及び聴いていただいた方々に感謝いたします。

●前回の補足

exit
339行目:FDは全てクローズ
UNIXでのポイント
ここで必ずクローズするので、exitするならFDをCloseする必要はありません。
342行目:inodeのリファレンスカウントをデクリメント。inodeのリファレンスカウントが1ならinodeを開放してパイプをアンロック
⇒ここもポイント。プロセス毎にカレントディレクトリを握っています。そのためここで参照を外しています。
348行目:acctでアカウンティングファイル?に書き込みをしている
⇒acct()が課金情報の書き込み。大昔のコンピュータは高価だったので、CPUの使用時間で従量制の料金を払ったそうなので、その元になる情報を書き込んでいます。

wait
waitはゾンビになったプロセスの後始末をします。
413行目:u_procp(アドレス)を指定してスリープします。
誰かがwakeupするまで、ずっとここで寝ています。

413 sleep((caddr_t)u.u_procp, PWAIT);

バックグラウンド”&” で起動したプロセスの終了はSIGCHILDのsignalが来るのでその時にwaitすることで、後処理をします。



システムコール番号の歴史」
@oracchaさんのまとめられた、システムコール番号の歴史を元に振り返ってみます。
http://tiki.is.os-omicron.org/tiki.cgi?c=v&p=%A5%B7%A5%B9%A5%C6%A5%E0%A5%B3%A1%BC%A5%EB%C8%D6%B9%E6%A4%CE%CE%F2%BB%CB

表の見方、
UNIX v7、MINIX 1.0、Linux 2.4.18、FreeBSD 4.5の1から100番まで
空欄はUNIX v7と同じという意味です。
番号が若いものは昔からあるシステムコール

ざっとですので、説明が抜けているところもありますが、ご容赦下さい。

exit 第15回プロセスの停止でやりました。
fork 第1回でやりました。
read ファイルシステムの辺りで軽くやりました。★
write ファイルシステムの辺りで軽くやりました。★
open ファイルシステムの辺りで軽くやりました。★
close ファイルシステムの辺りで軽くやりました。★
wait 第15回プロセスの停止でやりました。
creat ファイルシステムの辺りで軽くやりました。★
link ファイルシステムの辺りで軽くやりました。★
unlink ファイルの削除
exec 第2回でやりました。
chdir カレントディレクトリの変更
time プロセスの実行時間
mknod 特殊ファイルや通常のファイルを作成する
chmod パーミッションの変更
chown オーナーの変更
break BSSの下の端を下げます。メモリの使用領域の境界を下げる(だけ。)その当時malloc 自分で作るモノだったようです。
stat スーパーブロックの情報です(du, dfはボリューム全体の情報を示す)
seek File構造体のoffsetの値を変更する
getpid プロセスIDの取得
mount ファイルシステムでやりました。
umount ファイルシステムのアンマウント
setuid プロセス生成時にファイルの所有者(通常はroot)の権限を得られる
getuid ユーザIDを取得
stime
ptrace デバッガで使います
alarm
fstat 現在オープンしているファイルの情報を表示します
pause
utime
stty sttyシステムコールの実体、機能の多くはioctlに吸収されました。
gtty
access
nice プロセスの優先度の重み付けに使います。
ftime
sync ダーティなキャッシュをディスクに書き出します。sync;sync;syncで電源ブチが正式な作法(^^;)
kill 第13回シグナルでやりました
switch
tell
dup 第14回パイプでやりました
pipe 第14回パイプでやりました
times
prof
setgid
getgid
sig 第13回シグナルでやりました
acct アカウント
phys ?
lock ファイルロック
ioctl
mxpchan
exece
umask デフォルトでのファイル作成時のパーミッションを指定
chroot 特定のディレクトリをROOTと見なす

ファイルシステムは排他が細かくて読むのが大変

補足
V7にはmkdirがありません、mknodとlinkを組み合わせていたが問題がありました。
mknod とlinkの間でシステムがダウンあるいはCtrl+Cするとでは不整合が起き得るので後にアトミックなmkdir が用意されました。

UNIX以前(ジュラ紀)はファイルひとつ作るのも大変でした。UNIXはファイル名ひとつでファイルを生成できます。
ジュラ紀ファイルシステムはバイトストリームではありませんでした。
⇒ISAMファイルに近い(構造を持つ)形式だったようです。

ファイルシステムの違い
UNIX以前のファイルは構造を持つのが普通。UNIXは構造を待たないバイトストリーム。」

この「構造を持つ必要のあるファイル」はデータベースに進化しました。

すでに絶版の名著、「UNIXシステムコールプログラミング」と「UNIXプログラミング環境」などを写経するのが、昔ながらの学習方法のようです。

主要な内容はV7で学ぶUNIX講座で取り上げており、これを元に細かく見たりあるいはLinuxの実装を確認したりするには十分な内容だった(システムを俯瞰するという意味で)と思います。