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