慕的地10843
你不能在linux中创建一个无法杀死的进程。root用户(uid = 0)可以向进程发送信号,并且有两个信号无法捕获,SIGKILL = 9,SIGSTOP = 19。其他信号(未被捕获时)也可能导致进程终止。您可能需要一个更通用的守护进程函数,您可以在其中指定程序/守护程序的名称,以及运行程序的路径(可能是“/”或“/ tmp”)。您可能还想为stderr和stdout(以及可能使用stdin的控制路径)提供文件。以下是必要的包括:#include //printf(3)#include //exit(3)#include //fork(3), chdir(3), sysconf(3)#include //signal(3)#include //umask(3)#include //syslog(3), openlog(3), closelog(3)这是一个更通用的功能,intdaemonize(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);}这是一个示例程序,它成为守护进程,挂起,然后离开。intmain(){ 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表示捕获并忽略该信号。您可以构建一个可以记录信号接收的信号处理程序,并设置标志(例如标志以指示正常关闭)。