Как использовать fork() для демонализации дочернего процесса независимо от его родителя?
Возможный дубликат:
Linux: предотвращение остановки фонового процесса после закрытия SSH-клиента
У меня есть программа на C, с которой я обращаюсь и взаимодействую с терминалом (обычно из SSH в linux box). Я пытаюсь найти решение проблемы, когда после закрытия терминала/выхода из системы процесс заканчивается (программа в основном запрашивает некоторые варианты, а затем делает свой бизнес без дальнейшего взаимодействия, поэтому я хотел бы иметь его продолжают работать даже после выхода из системы SSH).
В Linux есть способы избежать этого, например, "экран", но я хочу сделать это программно с помощью C, не полагаясь на установленные пакеты, такие как screen-, даже если это означает переосмысление колеса.
До сих пор я понимаю fork() как стандартный тривиальный способ демонстрации процесса, так может ли кто-нибудь помочь мне закончить код, позволяющий выполнить описанный выше процесс?
Внутри родителя:
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
Теперь я могу выйти из SSH, который закрывает исходную оболочку... и ребенок продолжает свою работу!
Внутри ребенка:
//Continue with processing data/whatever the program does (no input/output to terminal required)
exit(0);
Ответы
Ответ 1
для отсоединения процесса от родителя:
используйте setid() для дочернего процесса, он запустит программу на новом сеансе
sid = setsid();
взгляните на пример на http://www.itp.uzh.ch/~dpotter/howto/daemonize
Чтобы программа работала, даже когда терминал закрыт:
SIGHUP - это сигнал, посылаемый процессу, когда его управляющий терминал закрыт.
попробуйте проигнорировать его, используя
signal (SIGHUP, SIG_IGN);