Sto scrivendo un programma che forca più processi figlio e mi piacerebbe che tutti questi processi figli fossero in grado di scrivere righe su STDERR
e STDOUT
senza il l'output è confuso. Non sto facendo niente di speciale, semplicemente emettendo righe che terminano con una nuova linea (che, almeno a mio avviso, sarebbe un'operazione atomica per Linux). Da perlfaq:fork() e STDOUT/STDERR alla console da processi figlio
Sia il processo principale che quello in background (il processo "figlio") condividono gli stessi filehandle STDIN, STDOUT e STDERR. Se entrambi provano ad accedervi contemporaneamente, possono accadere cose strane. Potresti voler chiudere o riaprire questi per il bambino. È possibile aggirare questo problema aprendo una pipe (vedi open) ma su alcuni sistemi ciò significa che il processo figlio non può sopravvivere al genitore.
Dice che dovrei "chiudere o riaprire" questi filehandle per il bambino. La chiusura è semplice, ma cosa significa "riaprire"? Ho provato qualcosa di simile da dentro il mio processi figlio e non funziona (l'uscita viene comunque confuso):
open(SAVED_STDERR, '>&', \*STDERR) or die "Could not create copy of STDERR: $!";
close(STDERR);
# re-open STDERR
open(STDERR, '>&SAVED_STDERR') or die "Could not re-open STDERR: $!";
Quindi, cosa sto facendo di sbagliato in questo? Come sarebbe l'esempio di tubo che allude? C'è un modo migliore per coordinare l'output da più processi insieme alla console?
Ho finito per andare con IO :: Pipe e AnyEvent per i tubi e la selezione di IO, ma sembra funzionare. Grazie – mpeters