goo blog サービス終了のお知らせ 

ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

UNIX カット&ペースト

2006-05-27 12:50:28 | PG(UNIX)

UNIXのコマンドを2つばかり追加しようと思ったら、またぞろ書いてないコマンドを発見。

  • ファイル内容関連にcut & paste追加。(Windowsのカット&ペーストと誤解されやすいなー)
  • ファイル内容関連にhead,tailを追加。
  • 端末関連にtty追加。
  • コマンド関連にfc -l追加。(fcでコマンド再実行も出来ると思うんだけど、いまいちやり方がわからない(爆))
  • ユーザー関連にwho追加。
  • umaskに説明を追加。

UNIXもろもろ

2006-05-14 00:49:51 | PG(UNIX)

UNIXのもろもろちょいネタを更新。

話題の一貫性が全然無いな~(爆)


sleepの対象はスレッドでした(汗)

2006-05-12 00:06:19 | PG(UNIX)

sleep()の実験をする専用のプログラム(UNIX:C言語)を作って試してみたところ、sleep(),usleep()の一時停止対象はプロセスでなくスレッドだった(汗)

おかしいなーと思ってマニュアルを見直したら、「man sleep」で表示されたのはセクション3F(FORTRAN)でやんの!(爆) うあー、ダメダメだぁ(泣)
改めてセクション3C(C言語)のsleep()を見てみると、先頭の方には「プロセスを止める」と書いてあるが、末尾の方に注意書きで「マルチスレッドの場合はnanosleep()で実装される」とあった。

usleep()の方は「呼出元を止める」としか書かれておらず、プロセスかスレッドかはっきりしないが、末尾の注意書きにはsleep()と同じことが書かれていた。

でnanosleep()を見ると、「カレントスレッドを止める」とばっちり書かれている!

…うー、昨日のselect()の調査は(本来の趣旨からは)意味無かったー(嘆)
しかしそうすると、当初のsleep()でうまくいかなかったのは何故だったんだろうなぁ? 何か見逃しがあって失敗したんだろうか。(他人のテストを横から見てたのが実態なので、細かい点は不明)


sleepの対象はスレッドかプロセスか?

2006-05-11 01:01:18 | PG(UNIX)

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()はすぐに終了する(書込み可能状態を返す)。

標準出力といえども、書込み専用ってわけじゃないんだねぇ…。