STDOUT в форках

SinteZ

Новичок
STDOUT в форках

Добрые сутки, All!

Создаю форки через $pid = pcntl_fork();

Подскажите пожалуйста как мне разрулить STDOUT каждого форка в отдельные файлы?

Заранее спасибо!
 

svetasmirnova

маленький монстрик
> Подскажите пожалуйста как мне разрулить STDOUT каждого форка в отдельные файлы?
А что значи "STDOUT каждого форка"?
 

AnToXa

prodigy-одаренный ребенок
STDOUT каждого форка в отдельные файлы
по отдельности все слова понимаю, а вместе - ну никак, хотя тоже вроде покурить не дурак :)

вам случайно нужно не man dup2?
 

SinteZ

Новичок
Да, то что доктор прописал (по документации), вот правда не могу подрубить, ругается, что не знает такую:
Fatal error: Call to undefined function: dup()

Взял с примера сишного кода:
PHP:
/* создание файла */
   fptr = open("DUMMY.FIL",O_CREAT|O_RDWR,S_IREAD|S_IWRITE);
   if(fptr)  {
      /* создать дополнительный дескриптор для stdout */
      oldstdout = dup(STDOUT);
      /* перенаправить стандартный вывод в файл, путем
         дублирования его дескриптора */
      dup2(fptr,STDOUT);
   }
А вот найти такое в php не удалось, вот что гугл говорит (по сайту php.net):

Google search
 

svetasmirnova

маленький монстрик
SinteZ
Откуда у тебя STDOUT в PHP-скриптах берётся? Непременно в форке нужно что-то через [m]echo[/m] и друзья выводить? В форках есть код типа:
PHP:
some<br>
html
<?php
some php
?>
some<br>
html
?
 

ngm

Новичок
Возможно с output buffering получиться решить проблему
Посмотри ф/ции ob_start и тд
 

AnToXa

prodigy-одаренный ребенок
SinteZ
в пхп и не получится скорее всего, разве что свой extension написать под это дело, но нужно быть оочень аккуратным, чтобы с другими расширениями не пересечься + с sapi могут быть (читай скорее всего будут) проблемы.

ну или можно просто пхп(cli/cgi) запускать ручками из вот такой вот программки, пример которой ты привел, зачем только ручками такое перенаправление, если sh/bash/zsh/etc его сама сделать может.
 

svetasmirnova

маленький монстрик
AnToXa
Мне почему-то кажется, что проблему можно решить без перенаправления вообще. Или, на худой конец, ob_start & friends подойдут.
 

SinteZ

Новичок
Автор оригинала: svetasmirnova
SinteZ
Откуда у тебя STDOUT в PHP-скриптах берётся? Непременно в форке нужно что-то через [m]echo[/m] и друзья выводить?
Да, нужно уметь в любое время врубать логирование выдачи форка в файл и вырубать его. А чтобы внутри форка это было как можно более прозрачно (т.е. в идеале echo). Да, понимаю что можно внутри самого форка сделать функцию log, которая и будет в зависимости от флага "нужды" закидывать либо на stdout либо в файл. Но хотелось бы именно перенаправить вывод (т.к. сразу отпадут все проблемы с отловом и ошибок и других фенек, которые летят в stdout)
 

AnToXa

prodigy-одаренный ребенок
svetasmirnova
а разве была четко обозначена проблема? :)
anyway не смотрел ни разу на этот pcntl_fork() не знаю как оно работает в пхп.
 

SinteZ

Новичок
Автор оригинала: AnToXa
в пхп и не получится скорее всего, разве что свой extension написать под это дело...
Т.е. все таки в php нет магических dup'ов как в си? А так ведь то что надо :)
 

AnToXa

prodigy-одаренный ребенок
SinteZ
насколько я знаю - нет.
в чем проблема сделать просто C обертку для php cli ?
там же просто

fork()
execlp("/bin/sh(это имя бинарника, по lsb этот должен быть всегда)", "/bin/sh(это argv[0], т.е. имя программы)", "-c(это argv[1])", "<ваша комманда>(argv[2])", NULL (это признак конца argv));
wait(Любая подходящая функция из семейства)();
 

svetasmirnova

маленький монстрик
SinteZ
Наконец понятно стало :)

Средствами PHP это либо как ngm, либо как AnToXa уже сказали.

С ob_start это типа:

fork()
включаем буфферинг
что-то делаем
сохраняем то, что в буфере
 
Сверху