次のサンプル スクリプトを検討してください。
<?php
$pipes = array();
$p = proc_open('cat', array(0 => STDIN, 1 => STDOUT, 2 => STDERR), $pipes);
fgetc(STDIN);
(Debian のデフォルト) に/bin/sh
シンボリック リンクされている場合、シェルで実行されます。/bin/dash
cat
30760 pts/0 S+ 0:00 | \_ php f.php
30761 pts/0 S+ 0:00 | \_ sh -c cat
30762 pts/0 S+ 0:00 | \_ cat
ただし、/bin/sh
がリンクされている場合は、 の直接の子です:/bin/bash
cat
php
30786 pts/0 S+ 0:00 | \_ php f.php
30787 pts/0 S+ 0:00 | \_ cat
これは、生成されたプロセスにシグナルを確実に送信することを不可能にする非常に厄介な矛盾です (シグナルはシェルによって受信される場合があるため)。
proc_open/bin/sh
が指す場所によって動作が異なるのはなぜですか? シェルを実行しない方法/bin/sh
はありbash
ますか?