Exemplo de daemon em C II
Publicado por Andre Luiz da Silva 14/05/2004
[ Hits: 8.125 ]
Homepage: http://localhost
Galera... mais um exmplo de um daemon em C, agora usando mais alguns recursos como o uso syslog. Em um único código vc vai ver um exemplo de fork, uso do syslog e signals. belê?!
obs: eu não escrevi o código ;-)
/* UNIX Daemon Server Programming Sample Program Levent Karakas <levent@mis.boun.edu.tr> May 2001 To compile: cc -o exampled examped.c To run: ./exampled To test daemon: ps -ef|grep exampled (or ps -aux on BSD systems) To test log: tail -f /tmp/exampled.log To test signal: kill -HUP `cat /tmp/exampled.lock` To terminate: kill `cat /tmp/exampled.lock` */ #include <stdio.h> #include <fcntl.h> #include <signal.h> #include <unistd.h> #define RUNNING_DIR "/tmp" #define LOCK_FILE "exampled.lock" #define LOG_FILE "exampled.log" void log_message(filename,message) char *filename; char *message; { FILE *logfile; logfile=fopen(filename,"a"); if(!logfile) return; fprintf(logfile,"%s\n",message); fclose(logfile); } void signal_handler(sig) int sig; { switch(sig) { case SIGHUP: log_message(LOG_FILE,"hangup signal catched"); break; case SIGTERM: log_message(LOG_FILE,"terminate signal catched"); exit(0); break; } } void daemonize() { int i,lfp; char str[10]; if(getppid()==1) return; /* already a daemon */ i=fork(); if (i<0) exit(1); /* fork error */ if (i>0) exit(0); /* parent exits */ /* child (daemon) continues */ setsid(); /* obtain a new process group */ for (i=getdtablesize();i>=0;--i) close(i); /* close all descriptors */ i=open("/dev/null",O_RDWR); dup(i); dup(i); /* handle standart I/O */ umask(027); /* set newly created file permissions */ chdir(RUNNING_DIR); /* change running directory */ lfp=open(LOCK_FILE,O_RDWR|O_CREAT,0640); if (lfp<0) exit(1); /* can not open */ if (lockf(lfp,F_TLOCK,0)<0) exit(0); /* can not lock */ /* first instance continues */ sprintf(str,"%d\n",getpid()); write(lfp,str,strlen(str)); /* record pid to lockfile */ signal(SIGCHLD,SIG_IGN); /* ignore child */ signal(SIGTSTP,SIG_IGN); /* ignore tty signals */ signal(SIGTTOU,SIG_IGN); signal(SIGTTIN,SIG_IGN); signal(SIGHUP,signal_handler); /* catch hangup signal */ signal(SIGTERM,signal_handler); /* catch kill signal */ } main() { daemonize(); while(1) sleep(1); /* run */ } /* EOF */
Imprime a soma dos numeros positivos e negativos
Decomposição em fatores primos
Calculo calorico visando perca de gordura e definicao muscular
Aprenda a Gerenciar Permissões de Arquivos no Linux
Como transformar um áudio em vídeo com efeito de forma de onda (wave form)
Como aprovar Pull Requests em seu repositório Github via linha de comando
Visualizar arquivos em formato markdown (ex.: README.md) pelo terminal
Dando - teoricamente - um gás no Gnome-Shell do Arch Linux
Como instalar o Google Cloud CLI no Ubuntu/Debian
Mantenha seu Sistema Leve e Rápido com a Limpeza do APT!
Procurando vídeos de YouTube pelo terminal e assistindo via mpv (2025)
O que você está ouvindo agora? [2] (183)
Gestão de Ambiente em uma rede Linux (2)
Ajuda Pra Melhoria do NFTABLES. (7)
Zorin OS - Virtual Box não consigo abrir maquinas virtuais (4)