编写一个守护进程

 编写守护进程程序时需遵循一些基本规则,以防止产生不必要的交互作用,下面先说明这些规则,然后给出一个按照这些规则编写的函数deamonize.
  (1)首先,调用umask将文件创建屏蔽字设置为一个已知值(通常为0)。
  (2)调用fork,然后是父进程exit。
  (3)调用setsid创建一个新会话。
  (4)将当前工作目录更改为根目录。
  (5)关闭不需要的文件描述符。
  (6)将文件描述符0,1,2指向 /dev/null

  以下是一个记录日志的守护进程。

 1 #include "apue.h" //详解见另一片文章
 2 #include <syslog.h>
 3 #include <fcntl.h>
 4 #include <sys/resource.h>
 5
 6 void deamonze(const char *cmd)
 7 {
 8     int        i,fd0,fd1,fd2;
 9     pid_t    pid;
10     struct rlimit rl;
11     struct sigaction sa;
12
13     //1、调用umask将文件模式创建屏蔽字设置为一个已知值(通常为0)
14     umask(0);
15     if(getrlimit(RLIMIT_NOFILE,&rl)<0)        //获取文件描述符的数量
16         err_quit("%s:can‘t get file limit",cmd);
17
18     //2、使子进程成为会话的组长
19     if((pid = fork())<0)    //调用fork,然后父进程退出
20         err_quit("%s:can‘t fork",cmd);
21     else if(pid!=0)            //父进程
22         exit(0);            //退出父进程
23     setsid();                //调用setsid创建一个新会话
24
25     //3、确保未来的打开不能分配控制终端
26     sa.sa_handler = SIG_IGN;
27     sigemptyset(&sa.sa_mask);
28     sa.sa_flags = 0;
29     if(sigaction(SIGHUP,&sa,NULL)<0)
30         err_quit("%s:can‘t fork",cmd);
31     else if(pid != 0)
32         exit(0);
33
34     //4、切换工作目录到到根目录,避免无法卸载可卸载设备
35     if(chdir("/")<0)
36         err_quit("%s:can‘t change directory to /",cmd);
37
38     //6、关闭所有打开的文件描述符
39     if(rl.rlim_max == RLIM_INFINTY)
40         rl.rlim_max = 1024;
41
42     for(i=0;i<rl.rlim_max;i++)
43         close(i);
44
45     //6、把文件描述符0,1,2绑定到 /dev/null
46     fd = open("/dev/null",O_RDWR);
47     fd1 = dup(0);
48     fd1 = dup(0);
49
50     //初始化日志文件
51     openlog(cmd,LOG_CONS,LOG_DEAMON);
52     if(fd1!=0||fd1!=1||fd2!=2)
53     {
54         syslog(LOG_ERR,"unexpected file descriptors %d %d %d",fd0,fd1,fd2);
55         exit(1);
56     }
57
58 }
时间: 2024-11-08 18:23:07

编写一个守护进程的相关文章

【Linux学习】编写一个守护进程

题目: 编写一个守护进程,每隔3秒钟将当前时间输出.要求: 不能使用init_daemon系统调用. #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <time.h> #include <unistd.h> int main(void) { pid_t pid; pid = fork(); if(pid > 0) { exit(0); } if(0 ==

如何编写一个守护进程daemon

大体步骤如下 1.   调用fork()函数创建子进程后,让父进程立即exit(),这样产生的子进程变成孤儿进程,由init进程接管. 2.   调用setsid()函数,使得新创建的进程脱离控制终端,同时创建新的进程组,并成为该进程组的首进程.在linux系统中,所有的进程都属于各自的进程组,进程组是一个或多个进程的集合,一个进程组中至少有一个进程成员,否则就消亡了.每个进程组都有一个进程组ID,是由领头进程的进程号决定的,会话则是一个或多个进程组的集合,每个会话都有一个领头进程,会话和进程组

一个守护进程实例

void DaemonInit(void){ //LOG::INF("[ServerMeeting] 服务初始化.\n"); int pid; //如果是父进程,结束父进程,子进程继续 if(pid=fork()) { exit(0); } /*else if(pid<0) // 不可能进入 { exit(1); //fork失败,退出 }*/ //是第一子进程,后台继续执行 setsid();//第一子进程成为新的会话组长和进程组长 //并与控制终端分离 if(pid=fork

创建一个守护进程

一.概述:守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是随系统启动而存在,随系统关闭而消失的进程(也就是开机之后就会存在,关机才消失).守护进程是一种很有用的进程,Linux的大多数服务器就是用守护进程实现的. 在终端运行命令:ps axj | head 参数a表示不仅列出当前用户进程,也列出所有其它用户进程. 参数x表示不仅列出有控制终端的进程,也列出所有无控制终端的进程. 参数j表示列出与作业控制

小何讲进程: 编写Linux守护进程方法详解

守护进程概述 守护进程,也就是通常所说的Daemon进程,是Linux中的后台服务进程. 它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些事件的发生. 守护进程常常在系统引导载入时启动,在系统关闭时终止. Linux有很多系统服务,大多数服务都是通过守护进程实现的.守护进程的名字通常以d结尾,字母d就是Daemon的意思. 由于在Linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端

简单实现一个守护进程(Daemon)

学习进程就不得不提到一个运行在后台的特殊进程--守护进程.(也称精灵进程).Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能直接和用户交互.其它进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,它们一直在运行着而我们就将这种进程称为守护进程. 守护进程独立于控制终端并周期性的执行某种任务或者等待处理某些发生的事件.守护进程是一种很有用的进程.Linux的大多数服务器就是用1守护进程实现的,比如,Internet服务

用C#编写Linux守护进程

如果要在Red Hat Enterprise Linux上将.NET Core进程作为后台进程运行,则可以创建自定义systemd单元.今天我将为.NET Core编写两个自定义系统单元的例子.一个是运行.NET Core控制台应用程序的一种类型,另一个是运行ASP.NET Core Web应用程序的简单类型. 控制台应用程序 建立一个应用程序 您可以用dotnet run在systemd中使用指定项目目录作为工作目录.但是,我们来构建一个二进制文件并将其用于systemd.用dotnet ne

Linuxx环境下,使用PHP创建一个守护进程

<?php $pid = pcntl_fork(); // fork if ($pid < 0) exit; else if ($pid) // parent exit; else { // child $sid = posix_setsid(); if ($sid < 0) exit; for($i = 0; $i <= 60; $i++) { // do something for 5 minutes sleep(5); } } ?> 这是php官方手册给出的方法,不过在

Android守护进程

这几天,一位做Android的朋友和我探讨了一个问题:因为业务需求的原因,在自己的App长时间不使用被kill掉之后,如何让它再重新运行起来. 虽然,我本身很排斥这种做法,有点类似“流氓软件”的行为,但是还是查询了资料,大概想了一个实现的方式,和大家一起分享. 其实,这个问题可以简单的看作:如何编写一个守护进程. 使用C/C++编写一个守护进程的.so程序,Android端通过JNI调用.该进程监听当前的目标程序进程,如果目标程序被kill掉了,再重新start一下,大概的思路就是这样.伪代码如