2. La entrada estándar, la salida estándar y el error estándar se redirigen a /dev /null
La implementación del daemon es aproximadamente como sigue:
< pre> int daemonize (int nochdir, int noclose) {int fd; conmutador (tenedor ()) {case -1: return (-1), y caso 0: break; por defecto: _exit (EXIT_SUCCESS);} if (setsid () == -1) return (-1); if (nochdir == 0) {if (chdir (" /") = 0) {perror (" chdir "); return (-1);}} si (noclose == 0 &&(fd = open ("! /dev /null ", O_RDWR, 0)) = -1) {if (dup2 (fd, STDIN_FILENO) < 0) {perror (" dup2 stdin "); retorno (-1);} if (dup2 (fd, STDOUT_FILENO) < 0) {perror (" stdout dup2 "); retorno (-1);} if (dup2 (fd, STDERR_FILENO) < 0) {perror (" stderr dup2 "); retorno (-1);} if (fd > {if (close (fd STDERR_FILENO)) < 0) {perror (" cerca "); retorno ( -1);}}} return (0);} Entonces, si desea recuperar los datos de la consola del proceso, simplemente coloque la salida estándar El error estándar se redirige al archivo especificado, y luego leer el archivo bien. Aquí artículo escrito ejemplo, la simple presentación (aquí, el proceso de comunicación se completa con una señal kill, algo más dura) código es el siguiente, guardado como daemon_example.c
#include #include #include #include static int fd = -1; sigroutine void (int dunno) {switch (¡no sé) {case SIGUSR1: fprintf (stderr, " Obtener una señal - SIGUSR1 \\ n "); if (! fd = -1) cerca (fd); fd = open (" /Tmp /console_temp.log ", O_RDWR | O_APPEND | O_CREAT, 0600), si (fd == -1) break; dup2 (fd, STDIN_FILENO); dup2 (fd, STDOUT_FILENO); dup2 (fd, STDERR_FILENO); romper; caso SIGUSR2: fprintf (stderr, " Obtener una señal ! - SIGUSR2 \\ n "), si (fd = -1) cerca (fd); fd = open (" /dev /null ", O_RDWR, 0), si (fd == -1) break; dup2 ( fd, STDIN_FILENO); dup2 (fd, STDOUT_FILENO); dup2 (fd, STDERR_FILENO); break;} return;} int main () {señal (SIGUSR1, sigroutine); señal (SIGUSR2, sigroutine); daemon (1,0); for (;;) {fprintf (stderr, " test \\ n "); //continuar el sueño prueba de impresión (1);} return 0;} a continuación, compilar y ejecutar este programa: $ gcc -o daemon_example daemon_example.c $ chmod + x daemon_example $ ./daemon_example $ ps -ef | ? Grep raíz daemon_example 11328 1 0 19:15 00:00:00 ./daemon_example anteriormente, un proceso que se ejecuta en segundo plano, la EIP 11328 A continuación, escribir un guión para probar el programa, guardarlo como test.sh :!# /bin /bashpid = $ 1PS -p $ pid > /dev /NULLIF [$ -eq 0 !?]; then echo pid no existe salida 1fiecho pid $ pidtrap "! matar -usr2 $ pid &&salida 1 " ! HUP INT SALIR TERMkill -USR1 $ pidecho funciona, por favor wait..sleep 1tail -f -n 0 /tmp/console_temp.logecho hecho para ejecutar la secuencia de comandos con los siguientes resultados: $ ./test.sh 11328 11328 PID funciona, por favor Espere .. prueba de prueba Luego, presione ctrl + c para salir del script. El script le dirá al proceso que redirija la salida estándar y el error estándar a /dev /null y continúe ejecutándose en segundo plano. De esta manera, este script se convierte en una herramienta de depuración para el proceso en segundo plano. Debe ejecutarse cuando se necesitan los datos en segundo plano y no es necesario cerrarlos. Por supuesto, esto es solo un ejemplo. En las aplicaciones reales, se deben realizar mejoras, como cambiar la señal de desactivación a la comunicación de tubería o socket, limitar el tamaño del archivo de caché o borrarlo automáticamente. Al final del artículo, ¿es un poco complicado, qué mejor manera tienes, bienvenido comentarios e intercambios!
Bueno, he estado haciendo pasantías en los juegos de Netease últimamente, así que parece qu
Por una variedad de organizaciones y empresas, los datos son los más importantes para ellos
ambiente experimental bajo Linux: Bajo Vbox, máquina virtual Rehat5 Uso del servidor Samba Obj
El comando arping se puede usar para probar la conectividad entre los hosts en la LAN y prob
Vim no es común, pero las habilidades de comando muy prácticas
Configuraciones de firewall de Linux
Comando de consulta de rendimiento en Linux
Las habilidades del administrador del sistema Linux
La contraseña de Linux última batalla crack
Cuenta de Linux y grupo de usuarios
Mysql source in linux installation
Win10 Explorer agrega el botón de compartir
¿Dónde está la búsqueda avanzada de win7?
Perspectiva del administrador de red: lo que trajo win7
¿Cómo borra y ve Firefox la contraseña de inicio de sesión web recordada?
Cómo rechazar la modificación remota del valor de la clave de registro de Win8
¿Cómo eliminar el icono de bloqueo de límite de seguridad en la carpeta del sistema win7?
Proceso de resolución de nombres de dominio
Win10 Enterprise Edition 10240 detendrá la actualización del parche el 26 de marzo de 2014.