Jde svym detem NEpredat otevrene filehandly?
Pavel Smerk
xsmerk na fi.muni.cz
Středa Březen 25 23:54:10 CET 2009
Ahoj vespolek,
pokud mam na Windows skript test.pl
if (fork) {
close STDOUT;
} else {
close STDOUT;
system 1, 'taskmgr';
}
a volam jej jako perl test.pl > test.out, je vse v poradku, skript hned
skonci a zustane spusteny Task Manager (system 1, 'program' spusti na
Windows program, neceka na dokonceni, vrati PID, viz perlport).
Pokud ale zakomentuju close STDOUT v rodici, pripadne pred nej dam nejaky
sleep, je vse na prvni pohled stejne, ovsem pokud bych to zkusil spustit
znovu, OS mi rekne, ze "The process cannot access the file because it is
being used by another process." a lze dohledat, ze se jedna o test.out, na
kterem sedi spusteny taskmgr.exe.
Asi neco nechapu --- jaktoze musim STDOUT zavrit v obou vetvich driv nez
spustim ten Task Manager? Jak by slo udelat, aby se tomu spoustenemu procesu
nepredaval ten otevreny filehandle na STDOUT, ale v druhe vetvi programu (v
rodici) by sel dal pouzivat?
Nelze vyloucit, ze je to vec Windows, kde fork neni nativni, ale emulovany
perlem skrze thready. Ovsem v man perlfork, kde je ta emulace popsana, toto
neni zmineno mezi odlisnostmi, takze predpokladam, ze je to na unixu asi
podobne, byt tam nevim, jak bych dosahl te hlasky OS.
Naopak se v man perlfork pise "All open handles are dup()-ed in
pseudo-processes, so that closing any handles in one process does not affect
the others." a "Any filehandles open at the time of the fork() will be
dup()-ed. Thus, the files can be closed independently in the parent and
child, but beware that the dup()-ed handles will still share the same seek
pointer. Changing the seek position in the parent will change it in the
child and vice-versa. One can avoid this by opening files that need
distinct seek pointers separately in the child."
Ale mozna uz je na me jen moc pozde a prehlizim nejakou trivialitu. :-)
Diky za pripadne nakopnuti, P.
Další informace o konferenci Perl