#include <stdio.h>
#include <syslog.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
void daemonize(const char *cmd) {
int i,fd0,fd1,fd2;
pid_t pid;
struct rlimit r1;
struct sigaction sa;
umask(0);
if(getrlimit(RLIMIT_NOFILE,&r1) < 0) {
printf("%s:can`t get file limit",cmd);
exit(1);
}
if(pid=fork()) < 0) {
printf("%s:can`t fork",cmd);
} else if(pid !=0) {
exit(0);
}
setsid();
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if(sigaction(SIGHUP,&sa,NULL) <0) {
printf("%s:can`t ignore SIGHUP");
exit(1)
}
if((pid = fork)) < 0) {
printf("%s:can`t fork")
exit(1);
}
else if(pid != 0) {
exit(0)
}
if(chdir("/") < 0) {
printf("%s:can`t change directory to /");
exit(1);
}
if(r1.rlim_max == RLIM_INFINITY)
r1.rlim_max = 1024;
for(i=0;i<r1.rlim_max;i++) {
close(i);
}
fd0 = open("/dev/null",O_RDWR);
fd1 = dup(0);
fd2 = dup(0);
openlog(cmd,LOG_CONS,LOG_DAEMON);
if(fd0 !=0 ||fd1 != 1||fd2!=2) {
syslog(LOG_ERR,"unexpected file descriptors %d %d %d",fd0,fd1,fd2);
exit(1);
}
}
|
#include <unistd.h>
int daemon(int nochdir,int noclose);
在建立精靈進程的時候,每每須要將精靈進程的工做目錄修改成"/"根目錄
而且將標準輸入,輸出和錯誤輸出重定向到/dev/null daemon的做用就是當參數nochdir爲0時,將根目錄修改成工做目錄 noclose爲0時,作輸入,輸出以及錯誤輸出重定向到/dev/null
#include <unistd.h>
int main(int argc, char *argv[]) { ... if (daemon(0, 0)) {//調用glibc庫函數daemon,建立daemon守護進程 perror("daemon"); return -1; } 好了執行到這裏的就是daemon的子進程了[luther.gliethttp]. ... } |