2012-01-27 9 views
8

Duplicar posible:
Linux: Prevent a background process from being stopped after closing SSH clientCómo usar fork() para demonizar un proceso secundario independiente de su padre?

I tiene un programa C que I acceder e interactuar con más de terminal (por lo general de SSH en una caja de Linux). He estado tratando de encontrar la solución al problema donde después de cerrar la terminal/cerrar sesión, el proceso termina con ella (el programa básicamente pide algunas opciones y luego se ocupa de su negocio sin necesidad de más interacción, por lo que me gustaría tenerlo). continuar corriendo incluso después de desconectarme de SSH).

Hay maneras en Linux para evitar esto, como 'pantalla', pero quiero hacerlo programáticamente con C sin depender de paquetes instalados, como la pantalla, incluso si esto significa reinventar la rueda.

Hasta ahora entiendo que fork() es la forma trivial estándar de demonizar un proceso, así que ¿alguien podría ayudarme a terminar el código que permite que ocurra el proceso descrito anteriormente?

Dentro de los padres:

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 

ahora puedo cerrar la sesión de SSH que cierra la carcasa original, ... y el niño continúa su trabajo!

Dentro de niño:

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

Lea todas las respuestas. http://stackoverflow.com/questions/285015/linux-prevent-a-background-process-from-being-stopped-after-closing-ssh-client –

+0

Um, simplemente usa 'nohup' cuando lo ejecutas? No se requiere bifurcación. –

+0

@ Brian, nohup no me deja interactuar con el programa. Es una interacción de línea de comando. – user1166981

Respuesta

12

para separar el proceso del padre:

uso setsid() en el proceso de los niños, se ejecutará el programa en nueva sesión

sid = setsid(); 

eche un vistazo al ejemplo en http://www.itp.uzh.ch/~dpotter/howto/daemonize


mantener un programa que se ejecuta incluso cuando el terminal está cerrado:

SIGHUP es una señal enviada a un proceso cuando su terminal de control está cerrado.

tratan de ignorarlo utilizando

signal (SIGHUP, SIG_IGN); 
+0

Sí, otros han sugerido iniciar el programa con nohup, pero, ¿pueden sugerirnos cómo hacerlo programáticamente en el contexto del código que publiqué? – user1166981

+0

@User puede instalar una señal de transmisión para esta señal que la ignora. solo asegúrese de registrar el controlador con el nuevo proceso, no con el padre. http://www.gnu.org/software/libc/manual/html_node/Signal-Handling.html –

+0

Ok, lo intentaré, gracias a todos. – user1166981

Cuestiones relacionadas