Exemplo de daemon em C II
Publicado por Andre Luiz da Silva 14/05/2004
[ Hits: 8.016 ]
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 */
Shadow Mapping utilizando OpenGL e Cg
Jogo da cobrinha (Snake II) refeito em C e C++
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Não consigo baixar e usar temas no KDE [RESOLVIDO] (5)
Wifi parou de funcionar no Inspirion N4050 com Debian 12 (2)
Como faço boot direto na área de trabalho pelo sddm? [RESOLVIDO] (2)
Mint/Ubuntu desligam ao fechar a tampa (3)
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (22)