Zrobiłem fork i exec() na procesie, ale chciałbym uruchomić go w tle. Jak mogę to zrobić? Mogę po prostu uniknąć wywoływania waitpid na tym, ale wtedy proces siedzi tam na zawsze, czekając na przywrócenie statusu rodzicowi. Czy jest jakiś inny sposób na zrobienie tego?Jak wykonać exec() proces w tle w C?
Odpowiedz
Złap SIGCHLD i w programie obsługi wywołaj wait().
Niektóre smaki Posixa (myślę, że * BSD, ale nie cytuj mnie), jeśli zignorujesz SIGCHLD, jądro automatycznie oczyści proces zombie (co widzisz w ps). To fajna funkcja, ale nie przenośna.
Widelec do utworzenia wątku tła, a następnie exec. Zobacz pytanie dotyczące dupe na tej stronie: Can we start a background process using exec() giving & as an argument?
Tak, widziałem to pytanie, ale nadal nie odpowiada na moje oryginalne pytanie. Pewnie, że mogę uniknąć połączenia oczekującego, ale wtedy proces jest tam na zawsze. Widzę to za każdym razem, gdy uruchamiam ps -al. –
Nie sądzę, że odpowiedzi na poprzednie pytanie rzeczywiście odpowiadają na to pytanie (jak również aditya narzeka); poprawna odpowiedź została udzielona przez Avi. Ponadto sceptycznie podchodzę do tego, że odpowiedzi na poprzednie pytanie faktycznie odpowiadają na to pytanie (ponieważ OP chciał również stworzyć proces w tle i nikt nie powiedział mu o podwójnym rozwidleniu). –
waitpid(-1, &status, WNOHANG)
może zrobić to, czego potrzebujesz: powinien natychmiast wrócić, jeśli proces potomny nie zakończył działania. Alternatywnie możesz posłuchać sygnału SIGCHLD.
To nie jest dobra strategia - chyba że proces nadrzędny jest gotowy to robić w kółko (w przeciwnym razie nadal będziesz zombie). –
Niestety uzyskałem dokładnie taki wynik, jaki przewidział Martin, ale z pewnością brzmiało to dobrze do tego czasu. –
Wszystko zależy od struktury struktury nadrzędnej. Czasami łatwiej jest sondować sporadycznie, niż łapać SIGCHLD. –
Myślę, że to, co próbujesz zrobić, to stworzyć proces demona. Przeczytaj link o Wikipedii pod adresem this.
Przykład (z zaawansowanego programowania Stevena w Unix Środowiska), a także proces demon brzmi:
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int daemon_int(void)
{
pid_t pid;
if ((pid = fork()) < 0)
return (-1) ;
else if (pid != 0)
exit(0) ; /* The parent process exits */
setsid() ; /* become session leader */
chdir("/") ; /* change the working dir */
umask(0) ; /* clear out the file mode creation mask */
return(0) ;
}
Oczywiście to nie zakładamy Unix jak OS.
Twój program zawiera powyższą funkcję i wywołuje ją zaraz po uruchomieniu. Jest to następnie dyskalkowane z procesu nadrzędnego i będzie po prostu działało, dopóki nie zakończy się lub zostanie zabite.
Hmm bliższe zapoznanie się z pytaniem sprawia, że myślę, że Avi może mieć odpowiedź. Lub możesz spowodować, że pierwsze dziecko stanie się demonem, który czeka na zakończenie Wnuka. Tak więc zerwij połączenie między rodzicem i dzieckiem, aby rodzic mógł zakończyć, nie powodując wyjścia dziecka i wnuka. – Jackson
Jeśli chcesz to zrobić, chcesz również, aby oryginalny proces wywoływał funkcję wait(), aby pobrać dziecko. Ponieważ proces potomny szybko się zakończy (zaraz po rozwidleniu wnuka), twój oryginalny proces nie zablokuje długiego oczekiwania(). –
- 1. Jak wykonać gradle zadanie zewnętrzne (Exec) w tle?
- 2. golang exec proces w tle i pobierz jego pid
- 3. php proces w tle za pomocą funkcji exec
- 4. Proces PHP w tle
- 5. Proces w tle błędu pracownika
- 6. Jak stworzyć proces w tle na wiosnę?
- 7. iOS - jak ukończyć długi proces w tle
- 8. Jak wykonać proces na komputerze zdalnym, w języku C#
- 9. Długi proces w tle w ASP.NET - Application_Start lub oddzielny proces?
- 10. Wstrzymaj proces w tle w robospice
- 11. Proces uruchamiania w tle w systemie Android
- 12. Jak uruchomić powłokę exec w tle, gdy php kontynuuje
- 13. Uruchamianie polecenia jako proces w tle/usługa
- 14. Poprawnie zaimplementuj proces w tle Wątek w ASP.NET
- 15. Java: czekać na proces exec, aż wyjdzie
- 16. Java. Proces prowadzona przez Runtime.getRuntime() Zabij exec()
- 17. Jak zabić proces w tle z funkcji systemowej zadzwoń
- 18. Jak uruchomić polecenie jako proces w tle za pomocą ADB?
- 19. Jak uruchomić proces ~ 30sek w tle co godzinę (aplikacja iPhone)
- 20. Jak mogę umieścić bieżący działający proces linuxowy w tle?
- 21. Proces va_args w C++
- 22. Rozpocznij proces w tle z nohup przy użyciu tkaniny
- 23. Jak wykonać plik powłoki w języku C#?
- 24. dane zapisywać na dysk w Pythonie jako proces w tle
- 25. Jak utworzyć proces w C++ w systemie Windows?
- 26. Aby zidentyfikować proces w tle i wprowadzić go na pierwszy plan w C++ WIN32
- 27. Jak zabić proces C#?
- 28. Jak ukryć/odkryć proces w języku C#?
- 29. Wykonać proces z pamięci w ramach innego procesu?
- 30. Spawn proces tła w Ruby
To było najczystsze rozwiązanie do wdrożenia. Dzięki! –
Dla przyszłych programistów z tym samym pytaniem, oto co znalazłem na stronie 293 w "Programowaniu zaawansowanym w środowisku UNIX": SIGCHLD Ilekroć proces kończy się lub kończy, sygnał SIGCHLD jest wysyłany do rodzica. Domyślnie ten sygnał jest ignorowany, więc rodzic musi złapać ten sygnał, jeśli chce być powiadamiany za każdym razem, gdy zmienia się status dziecka. Normalnym działaniem w funkcji przechwytywania sygnałów jest wywołanie jednej z funkcji oczekiwania w celu pobrania identyfikatora procesu i stanu zakończenia dziecka. W tym przypadku potrzebowałem linii takiej jak liw.fi zasugerował: waitpid (-1, & status, WNOHANG | WUNTRACED); –