将进程设置为守护进程

  在正常条件下,我们将程序运行产生的信息打印到控制台实时显示,如果我们想讲一个程序以守护进程的方式进行运行,就需要改变信息的输出方向,将其导向到配置文件里设置的日志文件。

  将一个进程转换为守护进程需要进行几个步骤:

  1.fork一个新的进程,将父进程退出。

  2.将0、1、2三个文件描述符重定向。

  3.将1重定向到日志文件。

void daemonize()
{
           if(fork() != 0)     //将父进程退出
                      exit(0);
           setsid();            //设置新的会话
           LOG(LOG_LEVEL_INFO, "Daemonized ... pid = %d", (int)getpid());

           int fd = 0;
           if((fd = open("/dev/null", O_RDWR, 0)) != -1)  //打开空设备文件
           {
                      dup2(fd, STDIN_FILENO);         //将0重定向到/dev/null
                      dup2(fd, STDOUT_FILENO);      //将1重定向到/dev/null
                      dup2(fd, STDERR_FILENO);      //将2重定向到/dev/null
                      if(fd > STDERR_FILENO)
                                   close(fd);
           }

           if(g_conf->log_file != NULL && (fd = open(g_conf->log_file, O_RDWR|O_APPEND|O_CREAT, 0))!= -1)
           {
                      dup2(fd, STDOUT_FILENO);      // 将2重定向到日志文件
                      if(fd>STDERR_FILENO)
                                  close(fd);
           }
}

  其中dup2函数的作用是负复制文件描述符,将第一个参数中的文件描述符复制到第二个参数的文件描述符,即第二个文件描述符指向第一个文件描述符指向的文件,这意味着,这两个描述符共享同一个数据结构file结构体,这个file结构体的引用计数为2。

时间: 2024-10-31 04:35:00

将进程设置为守护进程的相关文章

Linux系统开发7 进程关系,守护进程

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲> Linux系统开发7  进程关系守护进程 终端 网络终端 Linux PCB结构体信息 进程组 修改子进程.父进程的组ID 会话组 设置一个会话脱离控制终端 生成一个新的会话 守护进程 守护进程模板 获取当前系统时间  终端 在UNIX系统中用户通过终端登录系统后得到一个Shell进程这个终端成为Shell进 程的控制终端Controlling Terminal在讲进程时讲过控制终端是保存在PCB

Linux环境编程之进程(七):守护进程

守护进程也是一种进程,它由如下特性: 1.生存期较长,在系统自举时启动,仅在系统关闭时终止. 2.没有控制终端,在后台运行. 系统中有很多守护进程,它们执行日常事务活动.如日志进程syslogd.web服务器httpd.邮件服务器sendmail和数据块服务器mysqld等.大多数守护进程都是以超级用户(用户ID为0)特权运行.没有一个守护进程具有控制终端,其终端设置为问号(?),终端前台进程组ID设置为-1.内核守护进程以无控制终端方式启动.用户层守护进程缺少控制终端可能是守护进程调用了set

(七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程

. . . . . 目录 (一) 一起学 Unix 环境高级编程(APUE) 之 标准IO (二) 一起学 Unix 环境高级编程(APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程(APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程(APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程(APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系

Linux进程实践(5) --守护进程

概述 守护进程是在需要在后台长期运行不受终端控制的进程,通常情况下守护进程在系统启动时自动运行,在服务器关闭的时候自动关闭:守护进程的名称通常以d结尾,比如sshd.xinetd.crond.atd等. 守护进程编程规则 调用umask将文件模式创建屏蔽字设置为一个已知值(通常是0) 调用fork(),创建新进程,它会是将来的守护进程 然后使父进程exit,保证子进程不是进程组组长 调用setsid创建新的会话 会话:是一个或者多个进程组的集合,通常一个会话开始与用户登录,终止于用户退出.在此期

Linux 进程(二):进程关系及其守护进程

进程关系 进程组 进程组是一个或多个进程的集合.通常,它们是在同一作业中结合起来的,同一进程组中的各进程接收来自同一终端的各种信号,每个进程组有一个唯一的进程组ID.每个进程组有一个组长进程,该组长进程的ID等于进程组ID.从进程组创建开始到最后一个进程离开为止的时间称为进程组的生命周期. #include <unistd.h> pid_t getpgrp(void); 返回值:调用进程的进程组ID int setpgid(pid_t pid, pid_t pgid); 返回值:成功,返回0:

守护进程与非守护进程

最近在看多线程的Timer章节,发现运用到了守护线程,感觉Java的基础知识还是需要补充. Java分为两种线程:用户线程和守护线程 所谓守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分.因 此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程.反过来说,只要任何非守护线程还在运行,程序就不会终止. 守护线程和用户线程的没啥本质的区别:唯一的不同之处就在于虚拟机的离开:如果用户线程已

linux 进程通信之 守护进程

守护进程(Daemon) Daemon(精灵)进程,是linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的时间.一般采用以d结尾的名字.从下面的进程信息可以看出,守护进程都是[?]. colord 1160 0.0 0.2 399424 14520 ? Ssl 6月06 0:00 /usr/lib/colord/colord Linux后台的一些系统服务进程,没有控制终端,不能直接和用户交互.不受用户登录,注销的影响,一直在运作着,他们都是守护进程.如ftp

进程编程:守护进程(daemon)

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<fcntl.h> #include<unistd.h> #include<sys/wait.h> #include<sys/types.h> #include<sys/stat.h> #define MAXFILE 65535 int main(){ pid_t pc; int i,

daemon_init函数:调用该函数把普通进程转变为守护进程

#include <unistd.h> #include <syslog.h> #include <fcntl.h> #include <signal.h> #define MAXFD 64 extern int daemon_proc; /* defined in error.c */ int daemon_init(const char *pname, int facility) { int i; pid_t pid; if ( (pid = fork(