fork() v FCGI
Jan Kasprzak
kas na informatics.muni.cz
Čtvrtek Červen 14 16:00:54 MEST 2001
Dobry den,
mam takovy problem: man FastCGI aplikaci a potreboval bych
v ni generovat nejaky vystup, ktery bych pak prohnal externim filtrem
(napriklad gzipem nebo necim podobnym) a ten by to posilal na vystup.
Normalne (v CGI) bych to delal nejak takto:
print "Content-Type: application/octet-stream\n\n";
open PIPE, "|gzip";
close STDOUT;
for (get_line()) {
print PIPE;
}
close PIPE;
Ve FCGI to tak snadno nejde, protoze STDOUT je pretizena vec,
ktera posila data do toho FCGI socketu. Takze gzip pak zapisuje uplne
jinam. Zkusil jsem to vyresit pres rouru takto:
pipe RFD, WFD;
if (fork > 0) { # rodic
close WFD;
while(<RFD>) { print; }
wait;
close RFD;
} else { # potomek
close RFD;
close STDOUT;
untie *STDOUT;
open STDOUT ">&WFD";
open GZIP "|gzip";
close STDOUT;
close WFD;
for (get_line()) { print GZIP; }
close GZIP;
exit 0;
}
Ale nejak to blbne - tahle vec prebere a vyridi jeden pozadavek,
ale druhy uz zpusobi zacykleni (strace -p nic neukazuje, takze to cykli
nekde v user-space). Navic se zacykli rodic, ne potomek.
Nevite nekdo, jak v FCGI korektne vytvorit potomka pripadne filtrovat
vystup pres externi program?
-Yenya
--
\ Jan "Yenya" Kasprzak <kas at fi.muni.cz> http://www.fi.muni.cz/~kas/
\\ PGP: finger kas at aisa.fi.muni.cz 0D99A7FB206605D7 8B35FCDE05B18A5E //
\\\ Czech Linux Homepage: http://www.linux.cz/ ///
It is a very bad idea to feed negative numbers to memcpy. --Alan Cox
Další informace o konferenci Perl