什麼是demon,deamon既一個運行中後臺的服務進程,不須要用戶輸入也不控制輸出,固定的或者週期性的提供一些服務,linux系統中的一些服務例如httpd,log系統等都是系統等deamon,那該如何建立本身的deamon呢?建立deamon應該注意哪些呢?建立一個deamon都必備哪些步驟呢?
首先要先fork一個進程,爲避免掛起終端,因此須要fork一個進程而且結束父進程。使程序後臺執行
其次設置會話ID,setid()使進程成爲組長進程
再次fork(),因爲設置了一個新的會話,裏面如今有一個組長進程,組長進程仍然能夠控制終端,爲了讓程序完全擺脫終端控制,因此須要再fork一個進程。
關閉全部文件描述符:建立的進程會繼承父進程的文件描述符,若是不關閉的話會產生一些異常的問題,
將標準輸入輸出,錯誤輸出定位到/dev/null中,若是不作這一部的話可能會致使打開的第一個文件描述符從0開始而致使程序的錯誤
fd = open("/dev/null", O_RDWR);
if (fd == -1) {
printf("open(\"/dev/null\") failed\n");
}
if (dup2(fd, STDIN_FILENO) == -1) {
printf("dup2(STDIN) failed\n");
}
if (dup2(fd, STDOUT_FILENO) == -1) {
printf("dup2(STDOUT) failed\n");
}
if (dup2(fd, STDERR_FILENO) == -1) {
printf("dup2(STDERR) failed\n");
}
if (fd > STDERR_FILENO) {
if (close(fd) == -1) {
printf("close() failed\n");
return;
}
}linux
其餘的步驟能夠從新設置掩碼:umask(0);
下面是一個建立的例子:
int fd;
int pid;
int i;
pid=fork();
if(pid != 0)
exit(1);
setsid();
pid=fork();
if(pid != 0)
exit(0);
chdir("/");
umask(0);
long maxfd;
if ((maxfd = sysconf(_SC_OPEN_MAX)) != -1)
{
for (fd = 0; fd < maxfd; fd++)
{
close(fd);
}
}
fd = open("/dev/null", O_RDWR);
if (fd == -1) {
printf("open(\"/dev/null\") failed\n");
}
if (dup2(fd, STDIN_FILENO) == -1) {
printf("dup2(STDIN) failed\n");
}
if (dup2(fd, STDOUT_FILENO) == -1) {
printf("dup2(STDOUT) failed\n");
}
if (dup2(fd, STDERR_FILENO) == -1) {
printf("dup2(STDERR) failed\n");
}
if (fd > STDERR_FILENO) {
if (close(fd) == -1) {
printf("close() failed\n");
return;
}
}繼承