1.源码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <signal.h>
#include <time.h>
#include <syslog.h>
int init_daemon(void)
{
int pid;
int i;
//忽略终端I/O信号, STOP信号
signal(SIGTTOU, SIG_IGN);
signal(SIGTTIN, SIG_IGN);
signal(SIGTSTP, SIG_IGN);
signal(SIGHUP, SIG_IGN);
pid = fork();
if(pid > 0)
{
//结束父进程, 使得子进程成为后台进程
exit(0);
}
else if(pid < 0)
{
return -1;
}
//建立一个新的进程组
setsid();
pid = fork();
if(pid > 0)
{
//保证该进程不是进程组长, 同时让该进程无法再打开一个新的终端
exit(0);
}
else if(pid < 0)
{
return -1;
}
//关闭所有父子进程继承的不再需要的文件描述符
for(i=0; i<NOFILE; close(i++));
//改变工作目录
chdir("/");
//将文件当时创建屏蔽字设置为0
umask(0000);
//忽略SIGCHLD信号
signal(SIGCHLD, SIG_IGN);
return 0;
}
int main()
{
time_t now;
init_daemon();
syslog(LOG_USER|LOG_INFO, "Test Daemon Process!");
while(1)
{
sleep(8);
time(&now);
syslog(LOG_USER|LOG_INFO, "System: %s", ctime(&now));
}
return 0;
}
2.编译源码
$ gcc -o daemon daemon.c -std=c99
3.运行及其结果
$ ./daemon
$ ps -ef | grep daemon
helen 1616 1 0 22:19 ? 00:00:00 ./daemon
helen 1634 1475 0 22:22 pts/0 00:00:00 grep --color=auto daemon
网友评论