Unix/Linuxプログラミング 理論と実践 5章
毎年毎年この季節のテレビ番組はいい感じにクソっぽいですね!
それはそうと5章終わったのでメモ。
デバイスとファイルの類似点と相違点、デバイスファイルのパーミッション、fcntlとioctlでデバイスドライバの設定を読み書き、とかそんな話の章だった。
デバイスファイルのiノードは知らなんだ。あとfcntlとかioctlは以前なんかで読んだがかなり忘れていた。けど使う機会が無いからすぐにまた忘れるんでしょう。。。
研究課題考えた分だけログを。
現在ネット環境が貧弱すぎて調べものする気がおきなくてアレである。
5.1
そもそもgpmが入っていない。。。マウスの出力を読むのは手持ちのうぶんつさんだと、どうも /dev/input/mice で全て読めるっぽい。分けて読みたいなら /dev/input/mouse0 とかそこらへんなのかな。
5.2
デバイスファイルの実行ビットの意味はさっぱり。
biffはメールが来た場合それを報告してもらうかどうかをシステムに知らせるコマンド。実際に通知を行うのはcomsatなようで、/var/run/utmp で誰がシステムにいるか見たあと、端末の実行ビットがONになってる場合に報告するらしい。
vmkichi:seikichi% ls -al `tty` crw--w---- 1 seikichi tty 136, 2 2010-01-01 19:56 /dev/pts/2 vmkichi:seikichi% biff y vmkichi:seikichi% ls -al `tty` crwx-w---- 1 seikichi tty 136, 2 2010-01-01 19:56 /dev/pts/2
確かにONになってる。こういう使い方もあるんやねぇ。。。
5.4
デバイスファイルを削除し、iノードが解放されても、ドライバはカーネル内に残るので、そのデバイスに接続するファイルを作るには?
mknod(1)でスペシャルファイルが作れる。引数でデバイス番号(MAJOR MINOR)を指定するっぽい。
5.5
SICPの3章でこの手の思考実験はやった覚えがあるしパス
5.8
流石に"a"指定すれば O_APPEND は有効になるんじゃ…。writeとlseekなわけないだろ…。といいつつ調べんのめどいしパスで…。
5.9
vmkichi:seikichi% ./echostate < /dev/tty echo is on , since its bit is 1 vmkichi:seikichi% ./echostate < /etc/passwd tcgetattr: Inappropriate ioctl for device vmkichi:seikichi% ./echostate < `tty` echo is on , since its bit is 1
ファイルだとioctlで失敗するのかな。まぁそもそもデバイスを制御する関数か。
5.10
zshで試すとどーも他の端末の属性変更がうまくいかなんだ。/bin/shで起動してやると普通に想定通りの動きをした。つまり(c)でttyp1からttyp2のechoをオフにすると、ttyp2側でちゃんとエコーされなくなる。
zshの時に上手く行かなかったのは、シェルが色々裏でやってるから?本には一部のシェルは編集機能を提供するためにローモードで実行していることや、端末属性を自動でリセットするとか書いてるけど、そこらへんが関係してるのかな?
5.17
ttyドライバの設定の4つのグループ名。
本文より
・入力: 端末から送られてきた文字に対してドライバができる処理
・出力: 端末に送られる文字に対してドライバができる処理
・制御: 文字がどのようんひ表現されるか。ビット数、パリティ、など
・ローカル: 文字がドライバ内にあるときにドライバが何をすることができるか
の4つ。
5.18
tcsetattrで端末のエコーをオフにして終了すると終了後もオフのままだが、ファイルをオープンしてO_APPENDを設定しても次にプログラムがそのファイルを開いた時は追加モードにはならない理由は?
追加モードはファイルに対してではなく、ファイルとの接続に対してだから、次に開いた時には関係無くなっているのでは。tcsetattrの方はプログラムも端末も同じ端末ドライバに接続しており、設定が残るから?
…うーん、何か怪しい理解だな。。。
5.21
/dev/null は書き込まれたデータを全て捨て、読み出してもデータを返さない。入力を捨てるために使ったり、空の入力にしたり。
/dev/zero は全てヌルキャラクタ(ASCII の NUL、0x00)の内容を読み出す。上書きしたり何も内容がない特定サイズのファイルを作るために使ったり。
似たよなもんとして /dev/random があるらしい。へー。
しかし今回サボりすぎだな。うーん。