Подтвердить что ты не робот

Как использовать 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);
4b9b3361

Ответ 1

для отсоединения процесса от родителя:

используйте setid() для дочернего процесса, он запустит программу на новом сеансе

 sid = setsid();

взгляните на пример на http://www.itp.uzh.ch/~dpotter/howto/daemonize


Чтобы программа работала, даже когда терминал закрыт:

SIGHUP - это сигнал, посылаемый процессу, когда его управляющий терминал закрыт.

попробуйте проигнорировать его, используя

signal (SIGHUP, SIG_IGN);