2012-01-27 20 views
8

Powiel możliwe:
Linux: Prevent a background process from being stopped after closing SSH clientJak używać fork() do demonizacji procesu potomnego niezależnie od rodzica?

Mam program C, który mam dostęp i interakcję z terminalem (zwykle z SSH na pole Linux). Próbowałem znaleźć rozwiązanie problemu, w którym po zamknięciu terminalu/wylogowaniu proces kończy się wraz z nim (program zasadniczo prosi o pewne opcje, a następnie wykonuje swoją działalność bez potrzeby dalszej interakcji, więc chciałbym go mieć kontynuować działanie nawet po wylogowaniu z SSH).

Istnieją sposoby w Linuksie, aby tego uniknąć, takie jak "ekran", ale chcę to zrobić programowo z C bez polegania na zainstalowanych pakietach, takich jak ekran - nawet jeśli oznacza to ponowne wymyślenie koła.

Do tej pory rozumiem, że fork() jest standardowym trywialnym sposobem demonizacji procesu, więc czy ktoś mógłby mi pomóc zakończyć kod, który pozwala na wykonanie opisanego powyżej procesu?

ciągu rodzica:

main() 
{ 

//Do interactive stuff 

signal(SIGCHLD, SIG_IGN); //stops the parent waiting for the child process to end 

if(fork()) 
exit(0); 
// and now the program continues in the child process 

mogę teraz wylogowania SSH która zamyka oryginalną powłokę ... i dziecko kontynuuje swoją pracę!

ciągu dziecka:

//Continue with processing data/whatever the program does (no input/output to terminal required) 
exit(0); 
+3

Przeczytaj wszystkie odpowiedzi. http://stackoverflow.com/questions/285015/linux-prevent-a-background-process-from-being-stopped-after-closing-ssh-client –

+0

Um, po prostu użyj 'nohup' kiedy go uruchomisz? Nie wymaga rozwidlenia. –

+0

@ Brian, nohup nie pozwoli mi wejść w interakcję z programem. Jest to interakcja w linii poleceń. – user1166981

Odpowiedz

12

odłączenia proces od rodzica:

użycie setsid() na procesie dzieci, to uruchomić program w nowej sesji

sid = setsid(); 

spójrz na przykład na http://www.itp.uzh.ch/~dpotter/howto/daemonize


aby zachować program działa nawet wtedy, gdy terminal jest zamknięty:

SIGHUP jest sygnał wysłany do procesu, gdy jej zacisk sterowania jest zamknięty.

starają się ignorować go za pomocą

signal (SIGHUP, SIG_IGN); 
+0

Tak, inni sugerowali uruchomienie programu z nohupem - ale czy możesz podpowiedzieć, jak to zrobić programowo w kontekście kodu, który napisałem? – user1166981

+0

@Użytkownik może zainstalować handset sygnału dla tego sygnału, który je ignoruje. tylko pamiętaj, aby zarejestrować handler z nowym procesem, a nie rodzicem. http://www.gnu.org/software/libc/manual/html_node/Signal-Handling.html –

+0

Dobrze, spróbuję, dziękuję wszystkim. – user1166981

Powiązane problemy