Блокировка именованных каналов с пользователем nobody - PullRequest
0 голосов
/ 16 марта 2010

У меня есть 2 коротких сценария. Первый, сценарий awk, обрабатывает большой файл и печатает в именованный канал myfifo.dat. Второй, скрипт Perl, запускает команду LOAD DATA LOCAL INFILE 'myfifo.dat'.... Оба этих сценария работают при локальном запуске следующим образом:

lee.awk big.file &
lee.pl

Однако, когда я вызываю эти скрипты с веб-страницы PHP, именованные каналы:

$awk="/path/to/lee.awk {$_FILES['uploadfile']['tmp_name']} &";
$sql="/path/to/lee.pl";

if(!exec($awk,$return,$err)) throw new ZException(print_r($err,true)); //blocks here
if(!exec($sql,$return,$err)) throw new ZException(print_r($err,true));

Если я изменю скрипты awk и Perl так, чтобы они записывали и читали в обычный файл, все работает нормально с PHP. Разрешения для fifo и обычного файла - 666 (для целей тестирования). Эти операции выполняются намного быстрее через именованный канал, поэтому я бы предпочел использовать один из них. Есть идеи как его разблокировать?

пс. В случае, если вам интересно, почему я собираюсь все это обострение, см. этот вопрос SO .

1 Ответ

1 голос
/ 30 марта 2010

Как вы, вероятно, знаете, когда вы открываете именованный канал для записи, вы будете блокировать, пока кто-нибудь другой не откроет его для чтения. Я полагаю, именно поэтому у вас есть «&» в конце командной строки в первом вызове exec ().

Но уважает ли PHP этот синтаксис? Я не эксперт по PHP, но если это неправильный метод возврата PHP exec () до того, как дочерний процесс завершит выполнение, тогда два вызова exec () будут сериализованы, и это полностью объяснит это поведение блокировки.

...