ネットニュース記事案内 (2003年6月21日〜)

2002[...] | 2003[6/1-|6/11-|6/21- | ...]

2003年6月26日

= fj.comp.lang.perl排他制御G

ネタが見つからない…。

…なので、しょうもない記事ですが(ぉ。

質問は「Windows 95でも排他制御ができるperl」なのですが、これ、アバウトすぎて質問者の真意がいまいちよくわからないんですよね。

ちょっと考えただけでも

  • UNIX(系)とWindows 95で既にあるスクリプトを同じように(無改造で)使いたい、だからUNIXで一般に用いられる排他制御が使えてWindows 95でも動くperlを教えて欲しい
  • スクリプトは共通で使いたいが、これから書く(改造する)のでWindows 95でも排他制御ができる方法と使えるperlを教えて欲しい
  • スクリプトもWindows 95だけで動けばよいので、Windows(95)ネイティブな(より確実性の高い)排他制御が使えるperlを教えて欲しい

と、いろいろ考えられるわけで。

なので、なんの前提条件も示さずに「symlink()が常道」とか書かれると、「ハァ? それはどこの世界の常道ですか?」とツッコミたくなりますな(笑)。しかも“UNIXでは”とか書かれると「それは違うだろ」と。

ふつーflockだよね。Windows 95用のperlでは多分使えないけど(爆)。

あと、極端な例としてロック用のサーバプロセスを作っちゃうってのもあるかも。

  • サーバは特定のポートをsocket→bind→listenしてselectで待ちます。クライアントからconnectで接続されるとselectから返ってくるのでacceptして、クライアントからのcloseを待ち、acceptしたディスクリプタをcloseしてselectに戻ります。
  • クライアントは(socket→)connectしてからcloseするまでがクリティカルセクションになります。

重要なのがサーバ側でforkしないこと(笑)。普通のサーバプログラムだと複数のサービスを並行して提供するのが普通なのでforkしちゃいますが、これはそれをしてはいけないのでfork厳禁。

この方法(?)だと、TCPさえ使えればたいていのOSで共通して使えますし、複数のコンピュータ間でロックができて、待ち行列も(listenによって)勝手に実装できてしまうのでかなり便利だと思う。プロセスが勝手に死んだときもTCP層でよきに計らってくれるので人手による調停が不要ですし。

問題はサーバプロセスが死ぬと、二進も三進も行かなくなることかな。

…どこかに大穴があったりして。


なっきー