Vous ne pouvez pas créer un processus sous Linux qui ne peut pas être tué. L'utilisateur root (uid = 0) peut envoyer un signal à un processus, et il y a deux signaux qui ne peuvent pas être capturés, SIGKILL = 9, SIGSTOP = 19. Et d'autres signaux (lorsqu'ils ne sont pas interceptés) peuvent également entraîner l'arrêt du processus.
Vous voudrez peut-être une fonction de démonisation plus générale, où vous pouvez spécifier un nom pour votre programme / démon, et un chemin pour exécuter votre programme (peut-être "/" ou "/ tmp"). Vous pouvez également fournir des fichiers pour stderr et stdout (et éventuellement un chemin de contrôle en utilisant stdin).
Voici les éléments nécessaires:
#include <stdio.h>    //printf(3)
#include <stdlib.h>   //exit(3)
#include <unistd.h>   //fork(3), chdir(3), sysconf(3)
#include <signal.h>   //signal(3)
#include <sys/stat.h> //umask(3)
#include <syslog.h>   //syslog(3), openlog(3), closelog(3)
Et voici une fonction plus générale,
int
daemonize(char* name, char* path, char* outfile, char* errfile, char* infile )
{
    if(!path) { path="/"; }
    if(!name) { name="medaemon"; }
    if(!infile) { infile="/dev/null"; }
    if(!outfile) { outfile="/dev/null"; }
    if(!errfile) { errfile="/dev/null"; }
    //printf("%s %s %s %s\n",name,path,outfile,infile);
    pid_t child;
    //fork, detach from process group leader
    if( (child=fork())<0 ) { //failed fork
        fprintf(stderr,"error: failed fork\n");
        exit(EXIT_FAILURE);
    }
    if (child>0) { //parent
        exit(EXIT_SUCCESS);
    }
    if( setsid()<0 ) { //failed to become session leader
        fprintf(stderr,"error: failed setsid\n");
        exit(EXIT_FAILURE);
    }
    //catch/ignore signals
    signal(SIGCHLD,SIG_IGN);
    signal(SIGHUP,SIG_IGN);
    //fork second time
    if ( (child=fork())<0) { //failed fork
        fprintf(stderr,"error: failed fork\n");
        exit(EXIT_FAILURE);
    }
    if( child>0 ) { //parent
        exit(EXIT_SUCCESS);
    }
    //new file permissions
    umask(0);
    //change to path directory
    chdir(path);
    //Close all open file descriptors
    int fd;
    for( fd=sysconf(_SC_OPEN_MAX); fd>0; --fd )
    {
        close(fd);
    }
    //reopen stdin, stdout, stderr
    stdin=fopen(infile,"r");   //fd=0
    stdout=fopen(outfile,"w+");  //fd=1
    stderr=fopen(errfile,"w+");  //fd=2
    //open syslog
    openlog(name,LOG_PID,LOG_DAEMON);
    return(0);
}
Voici un exemple de programme, qui devient un démon, traîne, puis part.
int
main()
{
    int res;
    int ttl=120;
    int delay=5;
    if( (res=daemonize("mydaemon","/tmp",NULL,NULL,NULL)) != 0 ) {
        fprintf(stderr,"error: daemonize failed\n");
        exit(EXIT_FAILURE);
    }
    while( ttl>0 ) {
        //daemon code here
        syslog(LOG_NOTICE,"daemon ttl %d",ttl);
        sleep(delay);
        ttl-=delay;
    }
    syslog(LOG_NOTICE,"daemon ttl expired");
    closelog();
    return(EXIT_SUCCESS);
}
Notez que SIG_IGN indique d'attraper et d'ignorer le signal. Vous pouvez créer un gestionnaire de signaux qui peut enregistrer la réception du signal et définir des indicateurs (tels qu'un indicateur pour indiquer un arrêt normal).