保健励志美文体育育儿作文
投稿投诉
作文动态
热点娱乐
育儿情感
教程科技
体育养生
教案探索
美文旅游
财经日志
励志范文
论文时尚
保健游戏
护肤业界

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

  可能很多伙伴对于守护进程都很陌生,甚至都不知道守护进程是什么。守护进程是操作系统后台的一种特殊进程,像Linux系统的大多数服务器都是通过守护进程实现的。今天给大家科普一下什么是守护进程以及linux系统如何创建守护进程。
  一、守护进程是什么?
  LinuxDaemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。
  守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行。守护进程经常以超级用户(root)权限运行,因为它们要使用特殊的端口(11024)或访问某些特殊的资源。
  一个守护进程的父进程是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函数,让根目录rdquo;rdquo;成为子进程的工作目录;
  (4)在子进程中调用umask函数,设置进程的umask为0;
  (5)在子进程中关闭任何不需要的文件描述符
  说明:
  (1)在后台运行。
  为避免挂起控制终端将Daemon放入后台执行。方法是在进程中调用fork使父进程终止,让Daemon在子进程中后台执行。
  if(pidfork())
  exit(0);是父进程,结束父进程,子进程继续
  (2)脱离控制终端,登录会话和进程组
  有必要先介绍一下Linux中的进程与控制终端,登录会话和进程组之间的关系:进程属于一个进程组,进程组号(GID)就是进程组长的进程号(PID)。登录会话可以包含多个进程组。这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。
  控制终端,登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们,使之不受它们的影响。方法是在第1点的基础上,调用setsid()使进程成为会话组长:
  setsid();
  说明:当进程是会话组长时setsid()调用失败。但第一点已经保证进程不是会话组长。setsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。
  (3)禁止进程重新打开控制终端
  现在,进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端:
  if(pidfork())
  exit(0);结束第一子进程,第二子进程继续(第二子进程不再是会话组长)
  (4)关闭打开的文件描述符
  进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误。按如下方法关闭它们:
  for(i0;i关闭打开的文件描述符close(i);gt;
  (5)改变当前工作目录
  进程活动时,其工作目录所在的文件系统不能卸下。一般需要将工作目录改变到根目录。对于需要转储核心,写运行日志的进程将工作目录改变到特定目录如tmpchdir()
  (6)重设文件创建掩模
  进程从创建它的父进程那里继承了文件创建掩模。它可能修改守护进程所创建的文件的存取位。为防止这一点,将文件创建掩模清除:umask(0);
  (7)处理SIGCHLD信号
  处理SIGCHLD信号并不是必须的。但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下可以简单地将SIGCHLD信号的操作设为SIGIGN。
  signal(SIGCHLD,SIGIGN);
  这样,内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同,BSD4下必须显式等待子进程结束才能释放僵尸进程。
  三、创建守护进程
  在创建之前我们先了解setsid()使用:
  includelt;unistd。hgt;
  pidtsetsid(void);
  DESCRIPTION
  setsid()createsanewsessionifthecallingprocessisnotaprocess
  groupleader。Thecallingprocessistheleaderofthenewsession,
  theprocessgroupleaderofthenewprocessgroup,andhasnocontrol
  lingtty。TheprocessgroupIDandsessionIDofthecallingprocess
  aresettothePIDofthecallingprocess。Thecallingprocesswillbe
  theonlyprocessinthisnewprocessgroupandinthisnewsession。
  调用进程必须是非当前进程组组长,调用后,产生一个新的会话期,且该会话期中只有一个进程组,且该进程组组长为调用进程,没有控制终端,新产生的groupID和sessionID被设置成调用进程的PID
  RETURNVALUE
  Onsuccess,the(new)sessionIDofthecallingprocessisreturned。
  Onerror,(pidt)1isreturned,anderrnoissettoindicatethe
  error。
  现在根据上述步骤创建一个守护进程:
  以下程序是创建一个守护进程,然后利用这个守护进程每个一分钟向daemon。log文件中写入当前时间
  01includelt;stdio。hgt;
  02includelt;unistd。hgt;
  03includelt;stdlib。hgt;
  04includelt;time。hgt;
  05includelt;fcntl。hgt;
  06includelt;string。hgt;
  07includelt;sysstat。hgt;
  08defineERREXIT(m)
  09do
  10{
  11perror(m);
  12exit(EXITFAILURE);
  13}
  14while(0);
  15voidcreatdaemon(void);
  16intmain(void)
  17{
  18timett;
  19intfd;
  20creatdaemon();
  21while(1){
  22fdopen(daemon。log,OWRONLYOCREATOAPPEND,0644);
  23if(fd1)
  24ERREXIT(openerror);
  25ttime(0);
  26charbufasctime(localtime(amp;t));
  27write(fd,buf,strlen(buf));
  28close(fd);
  29sleep(60);
  30}
  31return0;
  32}
  33voidcreatdaemon(void)
  34{
  35pidtpid;
  36pidfork();
  37if(pid1)
  38ERREXIT(forkerror);
  39if(pidgt;0)
  40exit(EXITSUCCESS);
  41if(setsid()1)
  42ERREXIT(SETSIDERROR);
  43chdir();
  44inti;
  45for(i0;ilt;3;i)
  46{
  47close(i);
  48open(devnull,ORDWR);
  49dup(0);
  50dup(0);
  51}
  52umask(0);
  53return;
  54}
  复制代码
  结果:
  守护进程是什么?linux创建守护进程的步骤详解
  结果显示:当我一普通用户执行a。out时,进程表中并没有出现新创建的守护进程,但当我以root用户执行时,成功了,并在目录下创建了daemon。log文件,cat查看后确实每个一分钟写入一次。为什么只能root执行,那是因为当我们创建守护进程时,已经将当前目录切换我目录,所以当我之后创建daemon。log文件是其实是在目录下,那肯定不行,因为普通用户没有权限,或许你会问那为啥没报错呢?其实是有出错,只不过我们在创建守护进程时已经将标准输入关闭并重定向到devnull,所以看不到错误信息。
  四、利用库函数daemon()创建守护进程
  其实我们完全可以利用daemon()函数创建守护进程,其函数原型:
  includelt;unistd。hgt;
  intdaemon(intnochdir,intnoclose);
  DESCRIPTION
  Thedaemon()functionisforprogramswishingtodetachthemselvesfrom
  thecontrollingterminalandruninthebackgroundassystemdaemons。
  Ifnochdiriszero,daemon()changestheprocessrsquo;scurrentworking
  directorytotherootdirectory();otherwise,
  Ifnocloseiszero,daemon()redirectsstandardinput,standardoutput
  andstandarderrortodevnull;otherwise,nochangesaremadeto
  thesefiledescriptors。
  功能:创建一个守护进程
  参数:
  nochdir:0将当前目录更改至ldquo;rdquo;
  noclose:0将标准输入、标准输出、标准错误重定向至ldquo;devnullrdquo;
  返回值:
  成功:0
  失败:1
  现在我们利用daemon()改写刚才那个程序:
  01includelt;stdio。hgt;
  02includelt;unistd。hgt;
  03includelt;stdlib。hgt;
  04includelt;time。hgt;
  05includelt;fcntl。hgt;
  06includelt;string。hgt;
  07includelt;sysstat。hgt;
  08defineERREXIT(m)
  09do
  10{
  11perror(m);
  12exit(EXITFAILURE);
  13}
  14while(0);
  15voidcreatdaemon(void);
  16intmain(void)
  17{
  18timett;
  19intfd;
  20if(daemon(0,0)1)
  21ERREXIT(daemonerror);
  22while(1){
  23fdopen(daemon。log,OWRONLYOCREATOAPPEND,0644);
  24if(fd1)
  25ERREXIT(openerror);
  26ttime(0);
  27charbufasctime(localtime(amp;t));
  28write(fd,buf,strlen(buf));
  29close(fd);
  30sleep(60);
  31}
  32return0;
  33}
  复制代码
  当daemon(0,0)时:
  守护进程是什么?linux创建守护进程的步骤详解
  结果同刚才一样,也是只有root才能成功,普通用户执行时看不到错误信息
  现在让daemon(0,1),就是不关闭标准输入输出结果:
  守护进程是什么?linux创建守护进程的步骤详解
  可以看到错误信息
  现在让daemon(1,0),就是不重定向,结果如下:
  守护进程是什么?linux创建守护进程的步骤详解
  这次普通用户执行成功了,以为没有切换到目录下,有权限
  其实我们可以利用我们刚才写的创建守护进程程序默认daemon()实现:
  代码如下:
  01includelt;stdio。hgt;
  02includelt;unistd。hgt;
  03includelt;stdlib。hgt;
  04includelt;time。hgt;
  05includelt;fcntl。hgt;
  06includelt;string。hgt;
  07includelt;sysstat。hgt;
  08defineERREXIT(m)
  09do
  10{
  11perror(m);
  12exit(EXITFAILURE);
  13}
  14while(0);
  15voidcreatdaemon(intnochdir,intnoclose);
  16intmain(void)
  17{
  18timett;
  19intfd;
  20creatdaemon(0,0);
  21while(1){
  22fdopen(daemon。log,OWRONLYOCREATOAPPEND,0644);
  23if(fd1)
  24ERREXIT(openerror);
  25ttime(0);
  26charbufasctime(localtime(amp;t));
  27write(fd,buf,strlen(buf));
  28close(fd);
  29sleep(60);
  30}
  31return0;
  32}
  33voidcreatdaemon(intnochdir,intnoclose)
  34{
  35pidtpid;
  36pidfork();
  37if(pid1)
  38ERREXIT(forkerror);
  39if(pidgt;0)
  40exit(EXITSUCCESS);
  41if(setsid()1)
  42ERREXIT(SETSIDERROR);
  43if(nochdir0)
  44chdir();
  45if(noclose0){
  46inti;
  47for(i0;ilt;3;i)
  48{
  49close(i);
  50open(devnull,ORDWR);
  51dup(0);
  52dup(0);
  53}
  54umask(0);
  55return;
  56}
  复制代码
  关于linux系统创建守护进程的操作步骤就给大家讲解到这里了,在这方面有需要的,不妨按上述操作一下。

嵌入式洗碗机放在哪嵌入式洗碗机如何安装图文介绍嵌入式洗碗机是指镶嵌在橱柜内的一种洗碗机形式,根据嵌入的形式不同,可分为全嵌、半嵌和下嵌三种。具体嵌入式洗碗机放在哪里,以及嵌入式洗碗机怎么安装,要根据嵌入式洗碗机的安装形式来……家用洗碗机尺寸规格多少美的嵌入式洗碗机尺寸介绍详解家用洗碗机给我们饭后的生活带来了帮助,特别是哪些不爱洗碗的懒人们,洗碗机帮助他们解决了饭后的烦恼。市场中洗碗机的品牌有多种,美的嵌入式洗碗机就是其中的一款,美的嵌入式洗碗机尺寸……自信名言增强自信的名言(六)1、自信是英雄的本质。2、自信是成功的第一秘决。3、勇敢乃是自信与害怕中间之道。4、地球上的任何一点离太阳都同样地过远。5、一个胆怯的问题总会得到一个自……西门子洗碗机怎么使用西门子洗碗机使用方法详细介绍任何的家用电器,如果不会正确的使用方法,那肯定无法保证好的使用效果,洗碗机也是一样,西门子洗碗机是一款品质非常值得信赖的好洗碗机,很多的消费者都有购买使用,而如果要购买西门子洗……十大洗碗机品牌排行榜盘点洗碗机怎么选购图文导语:洗碗,是每天我们吃完饭之后必须做的一件事情。有些人对于洗碗特别地反感,因为他们认为洗涤剂会使手指变得很粗糙,不好看。所以有些人喜欢定一些快餐来吃,不仅节省时间,而且还很方……我的青空作文栀子花香随梦想在这个夏天酝酿,雪白的花瓣在微风轻拂下嵌在这湛蓝的天幕里飞扬。岁月模糊了年轮。还记得刚步入中学的我对北师大满怀着憧憬。那便是我年少最纯真的梦。青春在悄……美的水槽洗碗机多少钱美的洗碗机怎么使用详解现在的生活节奏越来越快,很多人不想把时间浪费在洗碗上,都会自备一台洗碗机,来取代人工手洗,非常的方便。美的是一个不错的品牌,那么美的水槽洗碗机价格?美的洗碗机使用方法?美的水槽……乡村之旅作文1000字对于住在城市的孩子来说,能够去乡村进行一次游览,那是最有趣的事情了。三月,草长莺飞,正是万物复苏的季节。我们太仓日报的小记者来到位于新毛的电站村,进行了一次有意思的活动。……在我成长的道路上作文与点评童年是一颗颗晶莹的珍珠,儿时的生活被一串串记录下来;童年是一条清澈的小溪,儿时的生活磕磕碰碰,可却依然唱着欢快的歌;童年是一首押韵的诗,儿时的生活被一点点欢乐地朗诵出来。在我成……成长中的烦恼三年级作文每一个人在成长的道路上都不一定会一帆风顺,会经常遇到烦恼事、伤心事,当然我也不例外。小时候妈妈不约束我,让我自由自在的无忧无虑的玩耍,没有作业,没有试卷,可随着时间流逝,……冰箱酒柜一体式怎样冰箱酒柜一体式品牌介绍详解如果我们家里有一款冰箱酒柜一体式的家具产品的话,那么对于我们日常家居生活来说就会很方便,它不仅可以起到一个装饰的作用,而且它很实用,它的品牌有很多种,消费者都不知道什么品牌的好……智能鞋柜有哪些功能智能鞋柜功能介绍详解在进门口的地方,最不起眼、但是家家户户最不能缺少的就是鞋柜了。鞋柜的出现让我们的鞋子有了ldquo;家rdquo;的归所,对我们的鞋子保护和家里面的健康卫生都是很有帮助的。以往……
手机储存内存卡坏了怎么办手机储存内存卡坏了解决方法手机储存卡突然坏了怎么办?没关系,小编整理了十三种故障和解决的办法,一定能帮你解决储存卡的问题。【状况一】:将内存卡插在电脑上,内存卡无法识别的问题。这种情况往往是因为内……关于微笑的作文生活需要微笑微笑像黑暗中的一盏明灯,给人们带来光明和希望;微笑像久旱后的甘霖,滋润着枯渴的心灵;微笑是生活中最通俗的语言,能使人与人之间的矛盾化解。有一天中午放学,下着大雨,刮着凉飕……手机qq中毒了怎么办qq中毒了应该如何杀毒详解手机qq中毒了怎么办?如今,QQ在线用户到现在已经发展到上亿用户,在线人数超过一亿,是中国目前使用最广泛的聊天软件之一。在平常的使用中,QQ中毒现象是经常发生的事。不少人……智能手机中毒后可以连接电脑杀毒吗图文教程随着智能手机的广泛应用,手机病毒也变得越来越容易入侵我们的手机,那么智能手机中毒后可以连接电脑杀毒吗?这里给大家分析下。手机中毒后不可以直接连接电脑杀毒,首先确定病毒程序……手机中毒后可以连接电脑杀毒吗手机中毒后不可以直接连接电脑杀毒,首先确定病毒程序所在在手机存储卡中还是在手机程序中。1、如果病毒在手机存储卡里,首先要及时拆下存储卡,不要在继续使用,之后连入电脑杀毒,……2017关于圣诞节的优秀作文400字圣诞节虽然是个洋节日,可是它却从千里之外的外国飘到了中国。你走在大街上,随时都能闻到圣诞节的气息。以下是小编带来的圣诞节作文,希望对你有帮助。圣诞节作文(一)今天是圣诞节……小熊拔牙E度网专稿未经允许不得转载有只小熊叫胖胖,它的嘴特别馋,从早到晚吃个不停。早晨起床,牙也不刷就喝蜂蜜,白天和小伙伴们玩耍嘴也闲不住,边玩边嚼着糖,喝着甜果酱,到了晚上,躺……手机怎么杀毒不同系统不同方法图文手机病毒大家可能接触到并不多,但是它也是一种恶意的手机程序,具有非常强的破坏性特征,主要是利用一些浏览网站或者短信的方式传播。现在手机已经成为人人不可缺少的社交工具,里面可能还……手机容易中病毒吗手机中毒之后怎么办呢现在人们使用的手机一般都是智能手机,智能手机和其他的手机相比,功能更加的全面。我们也可以得到更好的体验。当我们在使用智能手机的时候,一般都会到网上下载软件。这样才能更好使用。手……手机中毒怎么办?手机中毒防御方法详解很多朋友都遇到过手机中毒的情况,一般情况下手机中毒都是因为木马网站导致的,但是其实中毒情况还是分很多种的,有些毒可以通过手机杀毒软件进行扫杀,但是隐藏比较深的毒就不容易杀死了,……什么是聚合物锂离子电池聚合物锂离子电池相关知识图文今天小编给大家介绍一下关于聚合物理锂离子电池的相关知识,对于大家来说锂离子电池其实并不陌生。我们所使用的手机电池很多的都是锂离子电池。关于聚合物锂锂离子电池所选用的电解质是有所……iPhone11弹出无法验证电池是正品是什么原因iPhoneiPhone11弹出无法验证电池是正品是什么原因呢?很多用户对此还不是很清楚,小编这里就给大家带来有关iPhone11弹出无法验证电池是正品是什么原因的回答,希望能够对大家有所……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网