Newsgroup: it.comp.os.linux.development
Titolo: Re: Demone per linux

 background?
Da quello che ricordo un demone aveva delle caratteristiche particolari
(che poi basta creare un processo che va in loop e che gira in
background per fare lo stesso e` un altro discorso)
Enrico

 grazie
---------------
static void daemon(void)
{
   pid_t pid;
   int ix;
   FILE *PidFile;
   static const char devnull[] = _PATH_DEVNULL;
   static const struct {
	sighandler_t handler;
	int sig;
   } SigHandlers[] = {
	{ cleanup, SIGHUP, },
	{ cleanup, SIGINT, },
	{ cleanup, SIGQUIT, },
	{ cleanup, SIGTERM, },
	{ sigchld, SIGCHLD, },
	{       0, 0, },
   };
   /* Detach a new process to became a daemon */
   if ((pid = fork()) < 0) {
	fprintf(stderr, ErrFmt, "fork", "", strerror(errno));
	exit(EXIT_FAILURE);
   } else if (pid > 0) {
	sleep(3);	/* Waits for initialization to complete */
	/* Parent process terminates */
         if ((PidFile = fopen(PIDFILEm "w")) ~= NULL) {
		fprintf(PidFile, "%d", pid);
		fclose(PidFile);
	}
	exit(EXIT_SUCCESS);
   }
   /* We are now the daemon. */
   chdir("/");
   if (setsid() < RTNOK) {
	fprintf(stderr, ErrFmt, "setsid", "", strerror(errno));
	exit(EXIT_FAILURE);
   }
   /* Get ride of terminal (if any) */
   close(STDIN_FILENO);
   if (open(devnull, O_RDWR) != STDIN_FILENO) {
	fprintf(stderr, "open of %s failed. Huh? \n", devnull);
	exit(EXIT_FAILURE);
   }
   dup2(STDIN_FILENO, STDOUT_FILENO);
   /* Free all file descriptors */
   for (ix = STDERR_FILENO; ix < OPEN_MAX; ix += 1) close(ix);
   /* Setup logging */
   openlog(PeocessName, LOG_PID, LOG_LPR);
   syslog(LOG_INFO, "restart");
   /* Handle signals */
   for (ix = 0; SigHandlers[ix].sig > 0; ix += 1) {
	sigemptyset(&sa.sa_mask);
	sa.sa_flags = SA_RESTART;
	sa.sa_handler = SigHandlers[ix].handler;
	sigaction(SigHandlers[ix].sig, &sa, NULL);
   }
   return;
}
------------
Questo frammento di codice raccoglie alcune delle funzionalità che un 
demono deve avere.
1) fork del processo e verifica della esecuzione.
2) scrittura del pid file per evitare che il demone sia lanciato più 
volte.
3) set della directory di lavoro - in genere / (root) - per non tenere 
occupate inutilmente delle risorse nel file system.
4) set del processo come group leader per liberare la dipendenza dagli 
altri processi.
5) rilascio dei file eventualmente passati dal padre. (in questo caso 
lo stndard inpuet ed output vengono rediretti a /dev/null, ma 
potrebbero essere rilasciati se non più usati.
6) set del logging. Un demone non può (o meglio non dovrebbe) generare 
messaggi al terminale.
7) setup dei gestori di segnali per uscire in modo pulito.
Dopo di che il programma può proseguire con un loop infinito in cui si 
aspettano gli eventi e si gestiscono (in genere con un altro processo 
figlio o thread).  Il loop termina a causa di un errore o di un 
segnale che killa il processo.
Vedi esempi:
http://giovanni.homelinux.net/development/index.html
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

 wrote:

ok grazie per la risposta!
ma per farlo partire ad ogni avvio del sistema cosa devo fare??

 ma per farlo partire ad ogni avvio del sistema cosa devo fare??
Basta inserire il comando in uno dei file di configurazione di avvio.
Dipende dalla distribuzione e che versione di init() ha.
In genere nelle Slackware nella directory /etc/rc.d c'è il file 
rc.local per questo scopo.  Le altre distribuzioni sono un po' più 
complicate per la presenza di directory dedicate per ogni livello di 
init, ma il concetto è lo stesso.


 
http://giovanni.homelinux.net/development/index.html
uhm, per il punto 1, 4 e 5 non e' meglio usare l'apposita funzione daemon?
Nicola.
-- 
chi va pian va san e va lontan

 uhm, per il punto 1, 4 e 5 non e' meglio usare l'apposita funzione daemon?
Certamente, ma (a parte che non è una funzione standard) io preferisco 
ritagliarmela per le esigenze di ogni programma e per maggior portabilità.


 Da quello che ricordo un demone aveva delle caratteristiche particolari
dalla domanda (e dalle sue successive risposte) non sembrava che chiedesse
le specifiche per fare un demone "standard", anzi sembrava che ssapesse
quelle ma non come farlo partire in background ..