0
  • 私はpopen()別のプログラムとdup()stdoutのプログラムを持っています
  • 別のプロセス (PHP の例など)から、またはSSH 経由で呼び出された場合、プロセスは終了しません。

process_test.c:

#include <stdio.h>
#include <unistd.h> 

int main() {
  int out;

  out = dup(STDOUT_FILENO);
  // close(out);

  popen("sleep 10\0", "r");
}

でコンパイルしgcc process_test.c、次で実行します。

  • ./a.out→正常終了
  • ruby -e 'system("./a.out");'→正常終了
  • php -r passthry("./a.out");->ハングする
  • ssh remotehost ./a.out->ハングする
  • dupdup を標準出力したり閉じたりしないと、ハングしません

これは、私が見つけた最も短い再現可能なコードであり、よりよく理解したい動作を示しています。

fork/pcntl/etc を使用して、複数の PHP アプリケーション/フレームワークからこれを抽出するのに何時間もかかりました。つまり、私がこれを書いたり、でっち上げたりしたわけではありません。しかし、明らかに、私がすべてをバラバラにしたため、その全体の感覚が失われました。

質問

  • 一部の呼び出しがハングする (php、ssh) 場合とそうでない場合 (ruby) があるのはなぜですか?
  • popen の後に fd を閉じても、プログラムがハングします。なぜ?
4

1 に答える 1