आप linux में एक प्रक्रिया नहीं बना सकते जिसे मार नहीं सकते। रूट उपयोगकर्ता (uid = 0) एक प्रक्रिया को एक संकेत भेज सकता है, और दो संकेत हैं जिन्हें पकड़ा नहीं जा सकता है, SIGKILL = 9, SIGSTOP = 19। और अन्य संकेत (जब अनकैप्ड) भी प्रक्रिया समाप्ति में परिणाम कर सकते हैं।
आप एक अधिक सामान्य डेमनीज फ़ंक्शन चाहते हैं, जहां आप अपने प्रोग्राम / डेमॉन के लिए एक नाम निर्दिष्ट कर सकते हैं, और अपने प्रोग्राम को चलाने के लिए एक पथ (शायद "/" या "/ tmp")। आप stderr और stdout (और संभवतः स्टड का उपयोग करके एक नियंत्रण पथ) के लिए फ़ाइल (s) प्रदान करना चाह सकते हैं।
यहाँ आवश्यक शामिल हैं:
#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)
और यहाँ एक अधिक सामान्य कार्य है,
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);
}
यहां एक नमूना कार्यक्रम है, जो डेमॉन बन जाता है, चारों ओर लटका हुआ है, और फिर निकल जाता है।
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);
}
ध्यान दें कि SIG_IGN सिग्नल को पकड़ने और अनदेखा करने के लिए इंगित करता है। आप एक सिग्नल हैंडलर का निर्माण कर सकते हैं जो सिग्नल की रसीद लॉग कर सकता है, और झंडे सेट कर सकता है (जैसे कि सुंदर बंद को इंगित करने के लिए एक झंडा)।