(nadesłane przez brian d Foy)
Nie ma jednego sposobu na uruchomienie kodu w tle, dzięki czemu nie trzeba czekać aby to się skończyło, zanim twój program przejdzie do innych zadań. Zarządzanie procesami zależy od konkretnego systemu operacyjnego, a wiele technik jest w perlipc.
Kilka modułów CPAN może być w stanie pomóc, w tym IPC::Open2 lub IPC::Open3, IPC::Run, Parallel::Jobs, Parallel::ForkManager, POE, Proc::Background i Win32::Process. Istnieje wiele innych modułów, których możesz użyć, więc sprawdź te przestrzenie nazw również w innych opcjach.
Jeśli jesteś na systemie Unix-like, może być w stanie uciec z wywołania systemowego, gdzie położyć & na końcu polecenia:
system("cmd &")
Można również spróbować użyć widelca , jak opisano w perlfunc (chociaż jest to to samo, co wiele modułów zrobi dla ciebie).
stdin, stdout i stderr są wspólne
Zarówno główny proces w tło, a jeden (proces "dziecko") mają te same stdin, stdout i stderr uchwytów plików. Jeśli obaj spróbują uzyskać do nich dostęp od razu, mogą się zdarzyć dziwne rzeczy. Możesz je zamknąć lub ponownie otworzyć dla dziecka. Możesz obejść ten problem otwierając potok (patrz open in perlfunc), ale w niektórych systemach oznacza to, że proces potomny nie może przeżyć nadrzędnego. Sygnały Sygnał SIGCHLD i ewentualnie SIGPIPE również będą potrzebne SIGCHLD jest wysyłany, gdy proces w tle zakończy się. SIGPIPE jest wysyłany, gdy piszesz do uchwytu pliku, którego proces potomny został zamknięty (niepobijany SIGPIPE może spowodować, że twój program cicho umrze). To nie jest problem z systemem ("cmd &").
Zombies
Musisz być przygotowany, aby "zbierać" procesu dziecko, kiedy to kończy.
$SIG{CHLD} = sub { wait };
$SIG{CHLD} = 'IGNORE';
Można również użyć podwójnego widelca. Natychmiast poczekasz() na pierwsze dziecko, a demon init będzie czekał() na wnuczka po jego wyjściu.
unless ($pid = fork) {
unless (fork) {
exec "what you really wanna do";
die "exec failed!";
}
exit 0;
}
waitpid($pid, 0);
Zobacz sygnałów perlipc dla innych przykładów kodu, aby to zrobić. Zombie nie stanowią problemu w systemie ("prog &").
testowany tutaj wydaje się jakoś pracę dla mnie. co próbujesz osiągnąć? – xenoterracide
czy ma otworzyć terminal, a następnie wydrukować hello world w terminalu? – xenoterracide
lub próbujesz wykonać asynchroniczne wywołanie, aby otworzyć terminal? – xenoterracide