UNIXのもろもろちょいネタを更新。
- manに「-l」オプションを追加
- SunのCコンパイラのオプションのメモを新設
- Sunのデバッガーdbxの使用法をちょっと修正
- ファイルの権限(パーミッション)のメモを追加(ディレクトリ内に移動する権限がxだとは知らなかった…)
- UNIXの一般的なディレクトリのメモを追加
- tcshのプロンプトの変更方法を追加
話題の一貫性が全然無いな~(爆)
UNIXの超ちょいネタ追加。
lsでワイルドカードを使いたい場合に、lsの代わりにechoを使ってみるとちょっといい感じ。
ついでにkccとかchgrpとか(さらについでに/usr/passwdとか)も備忘に追加。
sleep()の実験をする専用のプログラム(UNIX:C言語)を作って試してみたところ、sleep(),usleep()の一時停止対象はプロセスでなくスレッドだった(汗)
おかしいなーと思ってマニュアルを見直したら、「man sleep」で表示されたのはセクション3F(FORTRAN)でやんの!(爆) うあー、ダメダメだぁ(泣)
改めてセクション3C(C言語)のsleep()を見てみると、先頭の方には「プロセスを止める」と書いてあるが、末尾の方に注意書きで「マルチスレッドの場合はnanosleep()で実装される」とあった。
usleep()の方は「呼出元を止める」としか書かれておらず、プロセスかスレッドかはっきりしないが、末尾の注意書きにはsleep()と同じことが書かれていた。
でnanosleep()を見ると、「カレントスレッドを止める」とばっちり書かれている!
…うー、昨日のselect()の調査は(本来の趣旨からは)意味無かったー(嘆)
しかしそうすると、当初のsleep()でうまくいかなかったのは何故だったんだろうなぁ? 何か見逃しがあって失敗したんだろうか。(他人のテストを横から見てたのが実態なので、細かい点は不明)
C言語(UNIX)でスレッドに一時的なwaitを入れようと思ってsleep()を使ったら、どうも思ったのと動きが違う。
マニュアルを一見すると、sleep()及びusleep()が一時的に停止させるのは、スレッドではなくてプロセスらしいように書かれている(実はスレッドだったが)。
JavaやC#(.NET)のsleep()は「スレッドが対象」とjavadocやMSDNに書いてある(Threadクラスのメソッドだし)。
VC++で実験したところ、Windows APIの::Sleep()もスレッドが対象のようだ。
とりあえずsleep()以外の方法を探したところ、UNIXではselect()でタイムアウト時間のみを指定することで スレッドのスリープ代わりに使えるようだ。
当初はselect()を使って「標準入力の出力待ちや標準出力の入力待ちをすれば 絶対タイムアウトするだろう」と思ったんだけど、試してみたら期待と違う動作だった。
struct timeval tv={ 秒, マイクロ秒 }; //待ち時間
int fd=0; //0:stdin, 1:stdout, 2:stderr
fd_set fds;
FD_ZERO(&fds);
FD_SET(fd, &fds);
int ret=select(fd+1,&fds,NULL,NULL,&tv); //読込待ち
//int ret=select(fd+1,NULL,&fds,NULL,&tv); //書込待ち
Solaris(SunOS5.9)では、標準入力も標準出力も標準エラーも全く同じ動作で、
読込待ち:標準入力から何も入れなければタイムアウトするが、何か入れるとselect()を終了する。
書込待ち:select()はすぐに終了する(書込み可能状態を返す)。
標準出力といえども、書込み専用ってわけじゃないんだねぇ…。