68user's page 掲示板

Prev< No. 3129〜3134> Next  [最新発言に戻る] [過去ログ一覧]
No. 3129 # もも 2003/03/06 (木) 05:42:54
始めまして、いつもこちらでは陰ながら勉強させていtだいてます。
perlスクリプトのことでお教えください
ただ今企画中のスクリプトにおいて
外部コマンド実行時、そのコマンドプロセスの標準入力へ有る意味大量のデータ(文字列)を渡したいのです
しかしこの方法が全く頭に浮かばず情け無い状態であります!
PIPEやファイルシステムの基礎を知らない私にご教授下されば幸いです。

No. 3130 # 68user 2003/03/07 (金) 01:14:46
>>3129 もも
      open(OUT, "| command");
      print OUT "HOGEHOGEHOGEHOGEHOGEHOGEHOGE....";
      close(OUT);
ってことですか?

じゃなくて command の標準入力に渡しつつ、そのコマンドの
出力を受け取りたいなら IPC::Open2 などを使えばできます。
できますが、デッドロック回避などが面倒なので

      open(OUT, "| command > file");
      print OUT "HOGEHOGEHOGEHOGEHOGEHOGEHOGE....";
      close(OUT);
      open(IN, "< file");
      while (<IN>){
            ....
      }

でいーんではと思う軟弱な私。

No. 3131 # もも 2003/03/07 (金) 11:25:16
>>3139 金床
68user様なるほど理解しました前者が出来ればいいのです!
早速試してみます。ありがとうございました!

No. 3132 # koko 2003/03/10 (月) 10:36:24
親プロセスが複数の子プロセスを生成します。
親は子プロセスの終了をシグナル(SIGCHLD)ハンドラで検知し、waitで子プロセスの終了コード(exitの引数)を取得しています。
同時に、子プロセス数を減算します。(forkで子プロセス数を加算しています。)
シグナルハンドラの処理中に、別の子プロセスが終了した場合、SIGCHLDが無視されてしまう。
あるいは、ほぼ同時に複数の子プロセスが終了した場合には、1回しかSIGCHLDのシグナルが発生しないとの記述を見た事があるのですが、正しく全ての子プロセスの終了を検知する方法はありますでしょうか。
以前、頂いたNo. 2988で頂いた以下の方法でこのような懸念が解消されますでしょうか。

SIGCHLDのシグナルハンドラ--------------------------
        int pid,status,code;

        while((pid=waitpid(-1,&status,WNOHANG))>0){
                if(WIFEXITED(status)){
                        code = WEXITSTATUS(status);
                }
        }
--------------------------------------------------
また、waitpidがシグナルに割り込まれるとエラーになり、errnoにEINTRが設定されると思うのですが、WNOHANGを設定していた場合にはそのような事は無いと考えてしまって良いでしょうか。
よろしくお願いします。

No. 3133 # 68user 2003/03/10 (月) 22:33:46
>>3132 koko
まずは sigaction(2) を読んでください。

# わたしもよくわかってないので読んでいるところ。

No. 3134 # koko 2003/03/11 (火) 08:08:55
>> 3133
読んでみます。

Prev< No. 3129〜3134> Next  [最新発言に戻る] [過去ログ一覧]