olistudent
IPPF-Urgestein
- Mitglied seit
- 19 Okt 2004
- Beiträge
- 14,787
- Punkte für Reaktionen
- 13
- Punkte
- 38
So, ich versuchs mal...
Mit dem Signal-Handler kannst du auf die kill-Signale reagieren. (z.B. Konfig neu einlesen)
Das ist die daemonize-Funktion:
Da musst du mal schauen, welche Includes du brauchst. Bei Bedarf kann ich die auch noch posten.
Hauptprogramm:
Nach dem daemonize(); kommen keine Ausgaben mehr auf der Konsole!
MfG Oliver
Mit dem Signal-Handler kannst du auf die kill-Signale reagieren. (z.B. Konfig neu einlesen)
Code:
/******************************************************************************
* SigHandler
******************************************************************************/
void SigHandler(int signal)
{
switch(signal)
{
case SIGTERM:
slog ? syslog(LOG_DAEMON | LOG_INFO, "shutdown") : printf("CheckMailD <shutdown>\n");
intervall = 0;
break;
case SIGHUP:
slog ? syslog(LOG_DAEMON | LOG_INFO, "update") : printf("CheckMailD <update>\n");
if(!ReadConf())
{
intervall = 0;
}
break;
case SIGUSR1:
online = 1;
if(slog)
{
syslog(LOG_DAEMON | LOG_INFO, "wakeup");
}
else
{
printf("CheckMailD <wakeup>\n");
}
break;
case SIGUSR2:
online = 0;
if(slog)
{
syslog(LOG_DAEMON | LOG_INFO, "sleep");
}
else
{
printf("CheckMailD <sleep>\n");
}
}
}
Code:
/******************************************************************************
* Daemonize
******************************************************************************/
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,SigHandler); /* catch hangup signal */
signal(SIGTERM,SigHandler); /* catch kill signal */
signal(SIGUSR1,SigHandler);
signal(SIGUSR2,SigHandler);
}
Hauptprogramm:
Code:
#define PIDFILE "/var/run/checkmaild.pid"
#define LOCK_FILE "/var/lock/checkmail.lock"
#define RUNNING_DIR "/var/tmp"
int main(int argc, char **argv)
{
...
daemonize();
...
// install sighandler
if(signal(SIGTERM, SigHandler) == SIG_ERR)
{
slog ? syslog(LOG_DAEMON | LOG_INFO, "Installation of Signalhandler for TERM failed") : printf("CheckMailD <Installation of Signalhandler for TERM failed>\n");
return -1;
}
if(signal(SIGHUP, SigHandler) == SIG_ERR)
{
slog ? syslog(LOG_DAEMON | LOG_INFO, "Installation of Signalhandler for HUP failed") : printf("CheckMailD <Installation of Signalhandler for HUP failed>\n");
return -1;
}
if(signal(SIGUSR1, SigHandler) == SIG_ERR)
{
slog ? syslog(LOG_DAEMON | LOG_INFO, "Installation of Signalhandler for USR1 failed") : printf("CheckMailD <Installation of Signalhandler for USR1 failed>\n");
return -1;
}
if(signal(SIGUSR2, SigHandler) == SIG_ERR)
{
slog ? syslog(LOG_DAEMON | LOG_INFO, "Installation of Signalhandler for USR2 failed") : printf("CheckMailD <Installation of Signalhandler for USR2 failed>\n");
return -1;
}
// cleanup
unlink(PIDFILE);
MfG Oliver