আপনি লিনাক্সে এমন একটি প্রক্রিয়া তৈরি করতে পারবেন না যা হত্যা করা যায় না। মূল ব্যবহারকারী (uid = 0) কোনও প্রক্রিয়াতে একটি সংকেত প্রেরণ করতে পারে এবং দুটি সিগন্যাল রয়েছে যা ধরা যায় না, SIGKILL = 9, SIGSTOP = 19। এবং অন্যান্য সিগন্যালগুলি (যখন অপরিবর্তিত থাকে) এর ফলে প্রক্রিয়াটি সমাপ্ত হতে পারে।
আপনি আরও সাধারণ ডিমনাইজেশন ফাংশন পেতে পারেন, যেখানে আপনি আপনার প্রোগ্রাম / ডেমনটির জন্য একটি নাম এবং আপনার প্রোগ্রামটি চালানোর জন্য একটি পথ নির্দিষ্ট করতে পারেন (সম্ভবত "/" বা "/ tmp")। আপনি স্ট্ডার এবং স্টডআউট (এবং সম্ভবত স্টিডিন ব্যবহার করে একটি নিয়ন্ত্রণ পাথ) এর জন্য ফাইল (গুলি) সরবরাহ করতে চাইতে পারেন।
এখানে প্রয়োজনীয় অন্তর্ভুক্ত রয়েছে:
#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 সিগন্যালটি ধরা এবং উপেক্ষা করার জন্য নির্দেশ করে। আপনি এমন একটি সিগন্যাল হ্যান্ডলার তৈরি করতে পারেন যা সিগন্যাল রশিদ লগ করতে পারে এবং পতাকা সেট করে (যেমন গ্রেফিউড শাটডাউন নির্দেশ করার জন্য পতাকা)।