文档章节

3.守护进程

zhaiguanjie
 zhaiguanjie
发布于 2017/05/17 17:03
字数 818
阅读 7
收藏 0

首先学习下C语言如何创建一个进程:


#include 'unistd.h'
pid_t fork(void);//返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1

在linux中,一个进程可以通过调用fork()函数来创建一个新进程,原来的进程称为父进程,新进程称为子进程.
fork()函数被调用一次,但返回两次.其中父进程返回子进程的进程ID,子进程返回0.
子进程可以通过getppid()来获得父进程的进程ID.这样父子进程都能知道对方的信息了.

然后了解下什么叫孤儿进程:
当一个进程的父进程终止时,该进程就会变为孤儿进程,然后被init进程领养.
主要过程是,当一个进程终止时,内核逐个检查所有的活动进程,判断是否是终止进程的子进程.若是,则将该进程的父进程ID置为1(init进程的进程ID).

接着学习下什么叫守护进程:
定义:
    守护(daemon)进程是在后台运行且不与任何控制终端相关联的进程.
用途:
    守护进程一般作为服务器端程序,在后台一直运行,为系统提供服务.直到系统关闭时,才结束运行. 
    守护进程一般是进程组的组长进程,并且是会话的首进程.
创建方法:
    1调用umask(0),打开所有权限,子进程会继承父进程的文件权限屏蔽字,这样可以避免创建文件时的权限限制. 
    2调用fork()创建子进程,然后父进程调用exit()退出,这样子进程就继承了父进程的进程组ID. 
    3调用setsid(),创建一个新的会话,使得子进程满足:a成为会话首进程,b成为进程组的组长进程,c不再拥有控制终端.
    4将工作目录改为根目录,以免影响可加载文件系统.或者也可以改变到某些特定的目录. 
    5关闭所有打开的文件描述符.
    6将标准输入、标准输出、标准错误输出重定向到dev/null,关闭守护进程与终端的交互.
消息输出:
  daemon进程既然与终端没有交互,也就不能通过printf输出信息了.我们可以通过syslog机制来实现信息的输出.

 

输出. 接下来继续看代码,接着上一节看main()函数:


int main(int argc, char **argv) 
{
	.
	.
	.
    if (server.daemonize) daemonize();//将server进程设置为守护进程
    .
    .
    .
}

贴一下daemonize()的代码:


void daemonize(void) 
{
    int fd;

    if (fork() != 0) exit(0);//如果fork()返回的不是0,说明是父进程,父进程要主动退出,使子进程成为孤儿
    setsid(); /* create a new session */

    /* Every output goes to /dev/null. If Redis is daemonized but
     * the 'logfile' is set to 'stdout' in the configuration file
     * it will not log at all. */
    if ((fd = open("/dev/null", O_RDWR, 0)) != -1) {
    	//stdin是FILE *类型,属于标准I/O,在;STDIN_FILENO是文件描述符,是非负整数,一般定义为0,1,2,属于没有buffer的I/O,直接调用系统调用,在.
        dup2(fd, STDIN_FILENO);
        dup2(fd, STDOUT_FILENO);
        dup2(fd, STDERR_FILENO);
        if (fd > STDERR_FILENO) close(fd);
    }
}

© 著作权归作者所有

上一篇: 4.IO复用
下一篇: 2.载入配置文件
zhaiguanjie
粉丝 0
博文 17
码字总数 29518
作品 0
私信 提问
Hadoop启动和停止脚本解释

start-all.sh 启动所有的Hadoop守护进程。包括NameNode、 Secondary NameNode、DataNode、JobTracker、 TaskTrack stop-all.sh 停止所有的Hadoop守护进程。包括NameNode、 Secondary NameNo...

593653868
2016/10/13
0
0
python下编写守护进程

1、编写守护进程的步骤 Python创建守护进程其实和c创建守护进程的方式大同小异了,其实就是那么几个步骤: (1)创建子进程,父进程退出 (2)改变当前目录为根目录 (3)在子进程中创建新会...

翼动动空
2016/05/08
689
0
Linux多任务编程(七)---Linux守护进程及其基础实验

守护进程概述 守护进程,又叫daemon进程(不知怎的,我突然想起来吸血鬼日记中的达蒙了,很好看的美剧),是Linux中的后台服务进程。他是一个生存期较长的进程,通常独立于控制终端并且周期性地...

长平狐
2013/06/17
158
0
Linux 守护进程

一、基本概念 守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行。守护进程经常以超级用户(root)权限运行,因为它们要使用特殊的端口(1-1024)或访问某些特殊...

吃一堑消化不良
2016/12/09
17
0
linux各项系统服务的功能

Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户。提供这些服务的程序是由运行在后台的守护进程(daemons) 来执行的。守...

fighting-cluber
2014/03/28
825
0

没有更多内容

加载失败,请刷新页面

加载更多

数组算法

/*数组的相关的算法操作:1、在数组中找最大值/最小值*/class Test11_FindMax{public static void main(String[] args){int[] array = {4,2,6,8,1};//在数组中找最大...

architect刘源源
27分钟前
0
0
okhttp3 以上版本在安卓9.0无法请求数据的解决方案

应用官方的说明:在 Android 6.0 中,我们取消了对 Apache HTTP 客户端的支持。 从 Android 9 开始,默认情况下该内容库已从 bootclasspath 中移除且不可用于应用。且Android P 限制了明文流量...

chenhongjiang
今天
5
0
简单示例:NodeJs连接mysql数据库

开篇引用网上的说法: 简单的说 Node.js 就是运行在服务端的 JavaScript。Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。Node.js是一个事件驱动I/O服务端JavaScript环境,基于...

李朝强
今天
8
0
大数据学习路线

年薪30W大数据学习路线图: 一、Hadoop入门,了解什么是Hadoop 1、Hadoop产生背景 2、Hadoop在大数据、云计算中的位置和关系 3、国内外Hadoop应用案例介绍 4、国内Hadoop的就业情况分析及课程...

陈小君
今天
3
0
解读 Kylin 3.0.0 | 更敏捷、更高效的 OLAP 引擎

在近期的 Apache Kylin Meetup 成都站上,我们邀请到 Kyligence 架构师 & Apache Kylin Committer 倪春恩对 Kylin 3.0.0 版本的一些重要功能及改进从使用到原理进行了介绍: Apache Kylin 在...

ApacheKylin
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部