daemon

linux提供了daemon函数用于创建守护进程,实现原理如下:

#include <unistd.h>

int daemon(int nochdir, int noclose);

1. daemon()函数主要用于希望脱离控制台,以守护进程形式在后台运行的程序。

2. 当nochdir为0时,daemon将更改进城的根目录为root(“/”)。

3. 当noclose为0是,daemon将进城的STDIN, STDOUT, STDERR都重定向到/dev/null。

 

daemon的实现大致如下:

int daemon( int nochdir,  int noclose )
{
   pid_t pid;
   if ( !nochdir && chdir("/") != 0 ) //如果nochdir=0,那么改变到"/"根目录
       return -1;
   
   if ( !noclose ) //如果没有noclose标志
   {
        int fd = open("/dev/null", O_RDWR);
        if ( fd  <  0 )
            return -1;

 

       /* 重定向标准输入、输出、错误到/dev/null,

键盘的输入将对进程无任何影响,进程的输出也不会输出到终端

*/

dup(fd, 0);

dup(fd, 1);

dup(fd, 2);     

close(fd);

}

   pid = fork();  //创建子进程.
   if (pid  <  0)  //失败
      return -1;
   if (pid > 0)
       _exit(0); //返回执行的是父进程,那么父进程退出,让子进程变成真正的孤儿进程.

//创建的 daemon子进程执行到这里了
   if ( setsid()  < 0 )   //创建新的会话,并使得子进程成为新会话的领头进程
      return -1;
   return 0;  //成功创建daemon子进程
}

### Daemon 的概念 在计算领域,Daemon 是一种后台运行的服务程序,通常用于执行特定的任务或等待事件的发生。它独立于用户会话,在操作系统启动时自动加载并持续运行直到系统关闭[^1]。 Linux 和 Unix 系统中的 Daemons 负责处理各种任务,例如日志记录(syslogd)、打印作业管理(lpd),以及网络服务提供(sshd)。这些进程通常是无交互式的,并通过初始化脚本配置其行为。 #### 创建一个简单的 Daemon 进程 创建一个 Daemon 需要遵循一系列标准步骤来确保其能够脱离控制终端并在后台稳定工作: 1. **Fork 子进程** 主进程 fork 出子进程后退出,使子进程成为孤儿进程由 init 进程接管。 2. **设置会话 ID (setsid)** 使用 `setsid()` 将当前进程与任何现有会话分离,防止接收信号如挂起 (`SIGHUP`)。 3. **更改目录至根路径 (/)** 或指定的工作目录 此操作避免因某些文件系统的卸载而导致错误。 4. **重置文件模式掩码 (umask)** 设置 umask 值以确保生成的文件具有适当权限。 5. **重定向标准输入/输出流** 关闭默认的标准输入、输出和错误描述符并将它们重新指向 `/dev/null` 或其他合适位置。 下面是一个 Python 实现简单 Daemon 的例子: ```python import os import sys import time def create_daemon(): try: pid = os.fork() if pid > 0: # Parent process exits sys.exit(0) except OSError as e: print(f"Fork failed: {e}", file=sys.stderr) sys.exit(1) # Decouple from parent environment os.chdir("/") os.setsid() os.umask(0) with open('/dev/null', 'r') as dev_null_in, \ open('/dev/null', 'a+') as dev_null_out_err: os.dup2(dev_null_in.fileno(), sys.stdin.fileno()) os.dup2(dev_null_out_err.fileno(), sys.stdout.fileno()) os.dup2(dev_null_out_err.fileno(), sys.stderr.fileno()) if __name__ == "__main__": create_daemon() while True: with open("/tmp/daemon.log", "a") as log_file: log_file.write("Daemon running...\n") time.sleep(60) ``` 此代码片段展示了如何构建基本的守护进程框架,其中涉及的关键技术已在前面提到过。 #### 安全性和隔离机制 为了增强安全性,许多现代守护进程会在受限环境中运行,比如 chroot Jail。这种环境下,进程只能访问指定范围内的资源,从而减少潜在攻击面[^2]。管理员需定期审查此类环境的内容以防恶意软件突破限制。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值