bird昨日の話, 形容詞, ダメージ(2)

昨日の話

昨日の話ですけど、普通 daemon 化する時ってこちらのページにもあるように標準入出力/標準エラーを閉じた後 /dev/null などで埋めておくのがセオリーのようですから、あんまり問題にはならないのかもしれませんね。

まぁ場合によっては単に標準入出力/標準エラーを閉じるだけで済ましちゃうこともあるだろうし、そういう時はよくよく気を付けましょう、というお話でした。ニンニン<何者?!(笑。

形容詞

ある人のページで、「形容詞(や副詞?)の多すぎる文章は信用できない」というようなことが書いてあって、それ以来ちょっと気を付けるようにしてるんですが、どうも僕はそれらを多用してしまう傾向がありますね。感覚的に微妙なニュアンスを表現したい、という気持ちが強すぎるのかな1。ニュアンスをそういった言葉で説明しようとする方法論が間違ってるのかも。言葉を使う順序とか、文章自体の組み立て、タイミングといった要素で緩急付けられれば良いのだよなぁ。うーん難しい。

ダメージ(2)

やっぱり落下によるダメージはいろいろとあるようで、今度は HDD がちらほらと「Uncorrectable Error」を吐き出し始めました。いわゆる HDD クラッシュ間近、という状況ですね2。今のうちに、ということで新しい 2.5inch HDD を早速注文。ちなみに製品はこちら (ただし 80Gbytes 版)。

コメント

SAK (Wed, 12 Jan 2005 23:20:16)
close(0);
close(1);
close(2);
fd = open("/dev/null", O_RDWR);

最後のopen()の結果で、fd == 0 が帰ってくるのは保証されるもん?
Linuxでは期待どおり動きそうだが、ファイルディスクプリタが即再利用
されるかどうかは環境依存ぽくねぇ?
SAK (Wed, 12 Jan 2005 23:23:37)
>どうも僕はそれらを多用
でじつね氏の暑苦しい文章が治るとは思えん。
Digitune (Thu, 13 Jan 2005 01:14:39)
> 最後のopen()の結果で、fd == 0 が帰ってくるのは保証されるもん?

知らん。「インターネットに書いてありました」というのが根拠薄弱であることはおぬしも良く分かってるんだから、自分で調べれ。

> でじつね氏の暑苦しい文章が治るとは思えん。

余計なお世話じゃ(笑。
SAK (Thu, 13 Jan 2005 12:08:15)
>知らん。
酷いなぁ。引用した以上、引用した責任というものが(以下略
とりあえず、未定義動作に依存しないように書き直してみたぞ。
fd = open("/dev/null", O_RDWR);
if ( fd >= 0 )
{
close(0);
dup2(fd,0);
close(1);
dup2(fd,1);
close(2);
dup2(fd,2);
close(fd);
}
コレでどうよ?
Digitune (Thu, 13 Jan 2005 12:30:28)
おーサンプルコードさんくす。

> 酷いなぁ。引用した以上、引用した責任というものが(以下略

あのコードがまったく動かないわけじゃないだろうし、あれを見て違和感を感じるような人(君のような)ならばもっとまともっぽいコードを探してくるだろうから問題なかろう。

ちなみに PostgreSQL や pgpool では以下のようなコードなっておった。

i = open("/dev/null", O_RDWR);
dup2(i, 0);
dup2(i, 1);
dup2(i, 2);
close(i);

君のコードと似てるが、dup2 の「必要ならば最初に newfd をクローズ (close) する。」という仕様を利用して余計な close を省略している。とはいえ、わかり易さ、という意味で君のコードはすごくいいと思うよ。
SAK (Fri, 14 Jan 2005 12:29:00)
アセンブラのすごくえらい人からツッコミがあったぞ((;゜Д゜)ガクガクブルブル

dup2()の前にclose()してしまうと、fd=0がその間の割り込みかなんかで再利用される可能性があって危険。dup2()にclose()させたほうがアトミック動作になって安全なはず。

って事かな。
そ〜ゆ〜意味ではPostgreSQLのコードのほうが安全ってことだな。open()の返り値をチェックしてないのが気になるが。
Digitune (Fri, 14 Jan 2005 12:51:48)
適切なフォローありがとう。

UNIX で普通のプログラムを書いているだけだと「処理のアトミック性」とかそういったことを意識することって少ないけど、基本的に常に気をつけておく必要がある、ってことですね。僕も Java でサーバプログラム書いてたころはいろいろ考えてたはずなんだけど、すっかり鈍ってるなぁ(笑。

  1. そもそも元の文の趣旨が、そういう文章はたぶんに「感覚的」「情緒的」な面が含まれるので、という意味なのだと考えると、僕の例なんかはまさに「信用できない文」の典型のようなものなわけですけれども(笑。 ↩︎

  2. 今はそれほど出ていないこの Error の頻度が日増しに高まって、しまいには大事なファイルまで読めなくなってジ・エンド、というのがよくあるパターン。 ↩︎