Linux slogan
Visite também: BR-Linux.org · Dicas-L · NoticiasLinux · SoftwareLivre.org · UnderLinux · BestLinux
» Screenshot



» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha

» Wallpaper


Scripts

Linux user

Publicado por Andre Luiz da Silva em 14/05/2004    [ 2649 hits ]

Login: andrack, 70590 pontos

Homepage: http://localhost   


Descrição
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 ;-)

[ Download: exampled1.c ]   [ Enviar nova versão ]

[ Esconder código-fonte ]

/*
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 */

Scripts recomendados
   Script Linux recomendado Programa para demonstrar operadores
   Script Linux recomendado Shadow Mapping utilizando OpenGL e Cg
   Script Linux recomendado Lista Duplamente Encadeada em C
   Script Linux recomendado checkscan.h
   Script Linux recomendado Maior ou menor

Comentários
Nenhum comentário foi encontrado.

Contribuir com comentário
  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Responsável pelo site: Fábio Berbert de Paula - Copyleft 2002-2009 Viva o Linux.com.br

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.