范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

什么是守护进程,创建守护进程的步骤是什么?

  可能很多伙伴对于守护进程都很陌生,甚至都不知道守护进程是什么。守护进程是操作系统后台的一种特殊进程,像Linux系统的大多数服务器都是通过守护进程实现的。今天给大家科普一下什么是守护进程以及linux系统如何创建守护进程。
  一、守护进程是什么?
  Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。
  守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行。守护进程经常以超级用户(root)权限运行,因为它们要使用特殊的端口(1-1024)或访问某些特殊的资源。
  一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程。守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备stdout还是标准出错设备stderr的输出都需要特殊处理。
  守护进程的名称通常以d结尾,比如sshd、xinetd、crond等
  二、创建守护进程的步骤
  首先我们要了解一些基本概念:
  1、进程组 :
  每个进程也属于一个进程组
  每个进程主都有一个进程组号,该号等于该进程组组长的PID号 。
  一个进程只能为它自己或子进程设置进程组ID号
  2、会话期:
  会话期(session)是一个或多个进程组的集合。
  setsid()函数可以建立一个对话期:
  如果,调用setsid的进程不是一个进程组的组长,此函数创建一个新的会话期。
  (1)此进程变成该对话期的首进程
  (2)此进程变成一个新进程组的组长进程。
  (3)此进程没有控制终端,如果在调用setsid前,该进程有控制终端,那么与该终端的联系被解除。 如果该进程是一个进程组的组长,此函数返回错误。
  (4)为了保证这一点,我们先调用fork()然后exit(),此时只有子进程在运行
  现在我们来给出创建守护进程的所需步骤:
  编写守护进程的一般步骤:
  (1)在父进程中执行fork并exit推出;
  (2)在子进程中调用setsid函数创建新的会话;
  (3)在子进程中调用chdir函数,让根目录 ”/” 成为子进程的工作目录;
  (4)在子进程中调用umask函数,设置进程的umask为0;
  (5)在子进程中关闭任何不需要的文件描述符
  说明:
  (1)在后台运行。
  为避免挂起控制终端将Daemon放入后台执行。方法是在进程中调用fork使父进程终止,让Daemon在子进程中后台执行。
  if(pid=fork())
  exit(0);//是父进程,结束父进程,子进程继续
  (2)脱离控制终端,登录会话和进程组
  有必要先介绍一下Linux中的进程与控制终端,登录会话和进程组之间的关系:进程属于一个进程组,进程组号(GID)就是进程组长的进程号(PID)。登录会话可以包含多个进程组。这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。
  控制终端,登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们,使之不受它们的影响。方法是在第1点的基础上,调用setsid()使进程成为会话组长:
  setsid();
  说明:当进程是会话组长时setsid()调用失败。但第一点已经保证进程不是会话组长。setsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。
  (3) 禁止进程重新打开控制终端
  现在,进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端:
  if(pid=fork())
  exit(0);//结束第一子进程,第二子进程继续(第二子进程不再是会话组长)
  (4)关闭打开的文件描述符
  进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误。按如下方法关闭它们:
  for(i=0;i 关闭打开的文件描述符close(i);>
  (5) 改变当前工作目录
  进程活动时,其工作目录所在的文件系统不能卸下。一般需要将工作目录改变到根目录。对于需要转储核心,写运行日志的进程将工作目录改变到特定目录如/tmpchdir("/")
  (6)重设文件创建掩模
  进程从创建它的父进程那里继承了文件创建掩模。它可能修改守护进程所创建的文件的存取位。为防止这一点,将文件创建掩模清除:umask(0);
  (7)处理SIGCHLD信号
  处理SIGCHLD信号并不是必须的。但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下可以简单地将SIGCHLD信号的操作设为SIG_IGN。
  signal(SIGCHLD,SIG_IGN);
  这样,内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同,BSD4下必须显式等待子进程结束才能释放僵尸进程。
  三、创建守护进程
  在创建之前我们先了解setsid()使用:
  #include <unistd.h>
  pid_t setsid(void);
  DESCRIPTION
  setsid() creates a new session if the calling process is not a process
  group leader. The calling process is the leader of the new session,
  the process group leader of the new process group, and has no control-
  ling tty. The process group ID and session ID of the calling process
  are set to the PID of the calling process. The calling process will be
  the only process in this new process group and in this new session.
  //调用进程必须是非当前进程组组长,调用后,产生一个新的会话期,且该会话期中只有一个进程组,且该进程组组长为调用进程,没有控制终端,新产生的group ID 和 session ID 被设置成调用进程的PID
  RETURN VALUE
  On success, the (new) session ID of the calling process is returned.
  On error, (pid_t) -1 is returned, and errno is set to indicate the
  error.
  现在根据上述步骤创建一个守护进程:
  以下程序是创建一个守护进程,然后利用这个守护进程每个一分钟向daemon.log文件中写入当前时间
  01#include <stdio.h>
  02#include <unistd.h>
  03#include <stdlib.h>
  04#include <time.h>
  05#include <fcntl.h>
  06#include <string.h>
  07#include <sys/stat.h>
  08#define ERR_EXIT(m) \
  09do\
  10{\
  11perror(m);\
  12exit(EXIT_FAILURE);\
  13}\
  14while (0);\
  15void creat_daemon(void);
  16int main(void)
  17{
  18time_t t;
  19int fd;
  20creat_daemon();
  21while(1){
  22fd = open("daemon.log",O_WRONLY|O_CREAT|O_APPEND,0644);
  23if(fd == -1)
  24ERR_EXIT("open error");
  25t = time(0);
  26char *buf = asctime(localtime(&t));
  27write(fd,buf,strlen(buf));
  28close(fd);
  29sleep(60);
  30}
  31return 0;
  32}
  33void creat_daemon(void)
  34{
  35pid_t pid;
  36pid = fork();
  37if( pid == -1)
  38ERR_EXIT("fork error");
  39if(pid > 0 )
  40exit(EXIT_SUCCESS);
  41if(setsid() == -1)
  42ERR_EXIT("SETSID ERROR");
  43chdir("/");
  44int i;
  45for( i = 0; i < 3; ++i)
  46{
  47close(i);
  48open("/dev/null", O_RDWR);
  49dup(0);
  50dup(0);
  51}
  52umask(0);
  53return;
  54}
  复制代码
  结果:
  守护进程是什么?linux创建守护进程的步骤详解
  结果显示:当我一普通用户执行a.out时,进程表中并没有出现新创建的守护进程,但当我以root用户执行时,成功了,并在/目录下创建了daemon.log文件,cat查看后确实每个一分钟写入一次。为什么只能root执行,那是因为当我们创建守护进程时,已经将当前目录切换我/目录,所以当我之后创建daemon.log文件是其实是在/目录下,那肯定不行,因为普通用户没有权限,或许你会问那为啥没报错呢?其实是有出错,只不过我们在创建守护进程时已经将标准输入关闭并重定向到/dev/null,所以看不到错误信息。
  四、利用库函数daemon()创建守护进程
  其实我们完全可以利用daemon()函数创建守护进程,其函数原型:
  #include <unistd.h>
  int daemon(int nochdir, int noclose);
  DESCRIPTION
  The daemon() function is for programs wishing to detach themselves from
  the controlling terminal and run in the background as system daemons.
  If nochdir is zero, daemon() changes the process’s current working
  directory to the root directory ("/"); otherwise,
  If noclose is zero, daemon() redirects standard input, standard output
  and standard error to /dev/null; otherwise, no changes are made to
  these file descriptors.
  功能:创建一个守护进程
  参数:
  nochdir:=0将当前目录更改至“/”
  noclose:=0将标准输入、标准输出、标准错误重定向至“/dev/null”
  返回值:
  成功:0
  失败:-1
  现在我们利用daemon()改写刚才那个程序:
  01#include <stdio.h>
  02#include <unistd.h>
  03#include <stdlib.h>
  04#include <time.h>
  05#include <fcntl.h>
  06#include <string.h>
  07#include <sys/stat.h>
  08#define ERR_EXIT(m) \
  09do\
  10{\
  11perror(m);\
  12exit(EXIT_FAILURE);\
  13}\
  14while (0);\
  15void creat_daemon(void);
  16int main(void)
  17{
  18time_t t;
  19int fd;
  20if(daemon(0,0) == -1)
  21ERR_EXIT("daemon error");
  22while(1){
  23fd = open("daemon.log",O_WRONLY|O_CREAT|O_APPEND,0644);
  24if(fd == -1)
  25ERR_EXIT("open error");
  26t = time(0);
  27char *buf = asctime(localtime(&t));
  28write(fd,buf,strlen(buf));
  29close(fd);
  30sleep(60);
  31}
  32return 0;
  33}
  复制代码
  当daemon(0,0)时:
  守护进程是什么?linux创建守护进程的步骤详解
  结果同刚才一样,也是只有root才能成功,普通用户执行时看不到错误信息
  现在让daemon(0,1),就是不关闭标准输入输出结果:
  守护进程是什么?linux创建守护进程的步骤详解
  可以看到错误信息
  现在让daemon(1,0),就是不重定向,结果如下:
  守护进程是什么?linux创建守护进程的步骤详解
  这次普通用户执行成功了,以为没有切换到/目录下,有权限
  其实我们可以利用我们刚才写的创建守护进程程序默认daemon()实现:
  代码如下:
  01#include <stdio.h>
  02#include <unistd.h>
  03#include <stdlib.h>
  04#include <time.h>
  05#include <fcntl.h>
  06#include <string.h>
  07#include <sys/stat.h>
  08#define ERR_EXIT(m) \
  09do\
  10{\
  11perror(m);\
  12exit(EXIT_FAILURE);\
  13}\
  14while (0);\
  15void creat_daemon(int nochdir, int noclose);
  16int main(void)
  17{
  18time_t t;
  19int fd;
  20creat_daemon(0,0);
  21while(1){
  22fd = open("daemon.log",O_WRONLY|O_CREAT|O_APPEND,0644);
  23if(fd == -1)
  24ERR_EXIT("open error");
  25t = time(0);
  26char *buf = asctime(localtime(&t));
  27write(fd,buf,strlen(buf));
  28close(fd);
  29sleep(60);
  30}
  31return 0;
  32}
  33void creat_daemon(int nochdir, int noclose)
  34{
  35pid_t pid;
  36pid = fork();
  37if( pid == -1)
  38ERR_EXIT("fork error");
  39if(pid > 0 )
  40exit(EXIT_SUCCESS);
  41if(setsid() == -1)
  42ERR_EXIT("SETSID ERROR");
  43if(nochdir == 0)
  44chdir("/");
  45if(noclose == 0){
  46int i;
  47for( i = 0; i < 3; ++i)
  48{
  49close(i);
  50open("/dev/null", O_RDWR);
  51dup(0);
  52dup(0);
  53}
  54umask(0);
  55return;
  56}
  复制代码
  关于linux系统创建守护进程的操作步骤就给大家讲解到这里了,在这方面有需要的,不妨按上述操作一下。

三星洗衣机有哪些优势三星洗衣机优势详细介绍详解如今的三星已经开始不满足于手机产业的发展,开始涉足于各个方面的家电产业,随着西门子的没落,三星开始扩展他们的业务,三星洗衣机就是其中一个,三星洗衣机的口碑是很不错的,小编就为大家介三星爱婴洗衣机怎么样三星爱婴洗衣机性能介绍详解三星爱婴洗衣机大家了解吗,相信不了解三星爱婴洗衣机也认识三星公司,三星公司,是一个非常具有扩张力的企业,三星爱婴洗衣机怎么样呢?其实作为三星的产品,质量是一定有保证的,小编就为大家三星恢复出厂设置在哪?三星恢复出厂设置有什么方法随着科学技术的不断发展和完善,越来越多人使用三星手机。它不仅具备截屏任务管理耳机切歌手电筒等等功能,有的三星手机还具有遥控的功能等等。但是一般情况下,安卓手机使用就了之后,就会发现tefal蒸汽熨斗有哪些优点tefal蒸汽熨斗使用要点介绍图文为了衣物的平整干净,我们很多的消费者在购买使用熨斗的时候,都要好好考虑购买什么样的才能有一个好的使用效果,tefal蒸汽熨斗就是一款比较受到消费者喜爱的蒸汽熨斗品牌,小编今天来为大反渗透纯水机怎么样反渗透纯水机有哪些特点详解如今人们对饮用水的重视程度在不断提升,所以各种各样的净水设备也不断涌现。在众多的净水设备当中,ro反渗透纯水机是一种能起到微滤吸附超滤反渗透紫外杀菌超纯化作用的设备。反渗透纯水机好家用榨果汁机如何选购家用榨果汁机选购技巧详解现在的快节奏生活,使得越来越多的人开始关注养生补充身体所需要的维生素。维生素最好的摄入源肯定就是水果,但是有很多的朋友们对于水果并不是很喜爱,却很独爱水果鲜榨的果汁。所以,家用榨汁榨果汁机如何挑选榨果汁机挑选要点详细介绍现实生活中,有很多的朋友们对于水果并不是很喜爱,却很独爱水果鲜榨的果汁,这时候一台适合自己的榨果汁机就是非常必要的。今天小编就来教您几个榨果汁机挑选要点,让您再也不用为选择困难症而九阳果汁机多少钱九阳果汁机价格详解导语很多人都比较喜欢喝果汁,这样果汁机就必不可少了。而果汁机有家用和商用之分,果汁机,就是能够将蔬菜和水果榨成果汁的机器,九阳果汁机则是果汁机中的名牌产品,在市面上口碑不错。在本文家用面包机怎么用家用面包机使用步骤详解为了追求很方便更快捷更环保的生活,家用电器越来越普遍。人们在食物方便尤为重视,所以更倾向于自己准备吃的。有不少人都喜欢吃面包,那么大家知道面包机吗?大家有没有用过面包机呢?怎么用面如何使用美的搅拌机bp252美的搅拌机bp252使用说明详解对于许多热爱果汁饮料的朋友来说,一款合适的搅拌机是必不可少的,而在目前的搅拌机品牌当中,美的搅拌机因为使用方便,并且经济耐用,因此受到了消费者的喜爱,而接下来,小编就为大家具体的介家用豆浆机如何使用豆浆机使用方法介绍详解豆浆机是我们许多家庭中,都会有的小电器之一。现如今,不少人会有早上喝豆浆的习惯,豆浆可以为我们带来一天的精神。但是外面买的豆浆普遍偏贵,甚至会有严重兑水的现象,也很难保障安全问题。
华硕u303l测评介绍在我们的生活中,电脑成为我们工作不可缺少的一部分,随着电脑产品的不断增多,市场上电脑品牌也在不断扩大,电脑型号的不同也就导致配置的需求的不同,不同的配置也会有它们各个方面的优越性,u303ub怎么设置u盘启动u303ub笔记本bios设置u盘启动方法详细教程华硕u303ub笔记本是一款拥有着13。3英寸屏幕的超薄笔记本电脑,这款电脑搭载了intel酷睿第六代处理器以及gf940m显卡,能够满足用户们日常使用的需求,那么这款华硕u303即热式电热水器属于环保节能产品吗即热式电热水器目前所设置的功率在18。5千瓦,通常有相当一部分人对即热式电热水器的认识就是功率大用电高,这只是一个片面的认识。耗电量是跟时间功率成反比,但是时间跟功率成反比,也就是诺基亚8800sirocco报价及评测介绍图文诺基亚8800sirocco,是国际知名手机品牌诺基亚旗下上市于2006年的滑盖式手机,它选材质量好,做工精致,外观大气尊贵,报价也比较贵,甚至达到了上万元。那么,诺基亚8800s诺基亚2220怎么样诺基亚2220参数配置如何手机,对于现在的人们来说并不陌生吧,它已经取代了以前传统的通讯方式,成为现在人们最主要的通讯方式,特别是这几年,智能大屏手机的发展更是增加了手机的不少功能,什么华为苹果小米三星就是酷派6168h详细评测图文今天小编为大家讲述的是一款高端的商务手机酷派6168H手机,这款手机无论在做工方面还是配置方面,都是大气磅礴浑然天成。作为高端商务人士,大多会选择一款专用的商务手机来使用,那么这款nokia2228怎么样?报价多少?一说到诺基亚,不管男女老少的脑子里都会出现经典的直板按键机的样子,虽然现在智能手机占据了整个手机市场的极大一部分,但是没有人可以否认诺基亚在中国手机市场曾创下的辉煌。时至今日,即使三星c3310c报价参考和优缺点介绍图文导语如今我们几乎人人都有一部手机,虽然现在的手机价格不贵,并且功能也比较多,但是在几年前的时候,手机其实还没有那么普及,功能也是非常的简单,如今手机市场上的品牌非常得多,小编相信大iQOO9支持wifi6吗支持反向充电吗iQOO9有着很多的功能升级,那么iQOO9支持wifi6吗,支持反向充电吗,接下来小编就为大家带来了解答,感兴趣的朋友一定不要错过哦!一支持wifi6吗iQOO9支持wifi6功iQOOZ5X有无线充电吗可以使用无线充电吗iQOOZ5X是iQOO新推出的一款入门机型,算是iQOOZ5的改版,在处理器内存摄像头等主要配置上都有所减配,在续航方面几乎没有改变。那么iQOOZ5X有无线充电功能吗?iQOO泰捷盒子怎么样泰捷盒子评测图文伴随着小米乐视阿里巴巴等互联网公司纷纷进入智能机顶盒市场,电视盒子的竞争日益激烈。互联网公司利用自身优势,在网络上不断造势,那么,究竟该选择哪一款电视盒子呢?下面小编就来介绍一款电