- 私は
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
->ハングするdup
dup を標準出力したり閉じたりしないと、ハングしません
これは、私が見つけた最も短い再現可能なコードであり、よりよく理解したい動作を示しています。
fork/pcntl/etc を使用して、複数の PHP アプリケーション/フレームワークからこれを抽出するのに何時間もかかりました。つまり、私がこれを書いたり、でっち上げたりしたわけではありません。しかし、明らかに、私がすべてをバラバラにしたため、その全体の感覚が失われました。
質問
- 一部の呼び出しがハングする (php、ssh) 場合とそうでない場合 (ruby) があるのはなぜですか?
- popen の後に fd を閉じても、プログラムがハングします。なぜ?