Daemon 进程

最近工作需要写一个Daemon 进程,特总结相关技术。

Deamon进程特点: (来自AUPE)

      

    1〉 与tty(用户终端)分离。

    2〉 关闭不需要的文件句柄。(STDIN/STDOUT/STDERR)

    

这些特点的主要目的是为了稳定和安全。通常用户终端会因用户操作产生大量的Signal,这些信号的默认行为有可能会导致Daemon 进程异常退出。


下面一步步解释Daemon的创建。

int daemonize()  //daemon init
{

// di
  pid = fork(); 

if (pid < 0) {
/* fork() Fail */
error_syslog("Fork nd proxy Failed");
exit(EXIT_FAILURE);
}
if (pid > 0) {
/* fork() Success */
exit(EXIT_SUCCESS);
debug_syslog("fork success");
}


if ((sid = setsid()) < 0) {
error_syslog("setsid Failed!");
exit(EXIT_FAILURE);
}


/* 改变根目录 (为了系统安全) */
if(chdir("/") < 0) {
error_syslog("chdir Failed");
exit(EXIT_FAILURE);
}


/* change default file permission */
umask(0);


/* close file handle */
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);

    return EXIT_SUCCESS;
}


可以使用Linux系统提供的fork()函数创建子进程,从而实现守护进程的创建,编写如下的程序: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <time.h> void signal_handler(int signum) { printf("Daemon process is terminated.\n"); exit(0); } int main() { pid_t pid; time_t t; pid = fork(); if (pid < 0) { printf("Failed to create daemon.\n"); exit(1); } else if (pid > 0) { printf("Parent process ID is %d.\n", getpid()); return 0; } printf("Child process ID is %d.\n", getpid()); // 创建新会话,使子进程成为守护进程 if (setsid() < 0) { printf("Failed to create daemon.\n"); exit(1); } // 忽略终端信号,防止进程被终止 signal(SIGINT, SIG_IGN); // 注册信号处理函数,以便在进程被终止时输出信息 signal(SIGTERM, signal_handler); // 输出父进程ID和当前时间 printf("Parent process ID is %d.\n", getppid()); while (1) { time(&t); printf("Current time is %s", ctime(&t)); sleep(1); } return 0; } ``` 程序中首先使用fork()函数创建一个子进程pid,如果pid小于0,则说明创建进程失败;如果pid大于0,则说明当前进程是父进程,直接退出;否则说明当前进程是子进程,执行后续的创建守护进程的操作。 子进程首先调用setsid()函数创建新会话,使自己成为守护进程,并脱离终端。然后忽略终端信号,防止进程被终止。接着注册信号处理函数,以便在进程被终止时输出信息。最后进入一个死循环,输出父进程ID和当前时间,并睡眠1秒钟。 可以使用如下的命令编译和运行程序: ```bash gcc -o daemon daemon.c ./daemon ``` 程序将在后台运行,并输出父进程ID和当前时间。可以使用Ctrl+c组合键中断程序,观察输出信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值