[学习笔记]守护进程深入理解


什么是守护进程

q  守护进程是在后台运行不受控端控制的进程,通常情况下守护进程在系统启动时自动运行

q  守护进程的名称通常以d结尾,比如sshd、xinetd、crond等


创建守护进程步骤

q  调用fork(),创建新进程,它会是将来的守护进程

q  在父进程中调用exit,保证子进程不是进程组组长

q  调用setsid创建新的会话期

q  将当前目录改为根目录 (如果把当前目录作为守护进程的目录,当前目录不能被卸载,它作为守护进程的工作目录了。)

q  将标准输入、标准输出、标准错误重定向到/dev/null


守护进程api

int daemon(int nochdir, int noclose);

q  功能:创建一个守护进程

q  参数:

q  nochdir:=0将当前目录更改至“/”

q  noclose:=0将标准输入、标准输出、标准错误重定向至“/dev/null”

man setsid

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 controlling 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.

有的进程有tty,有的进程没有tty。带问号的是守护进程。

会话期:是一个或者多个进程组的集合,通常一个会话期开始与用户登录,终止于用户退出。在此期间,该用户运行的所有进程都属于这个会话期。

#include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <fcntl.h>

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <signal.h>

#define ERR_EXIT(m)     do     {         perror(m);         exit(EXIT_FAILURE);     } while(0)

int setup_daemon(int nochdir, int noclose);

int main(int argc, char *argv[])
{
    mydaemon(1, 1);
    //man daemon 可以看到
    //0表示改变重定向   1表示不改变
    //daemon(1, 1);
    printf("test ...\n");
    for (;;) ;
    return 0;
}

int mydaemon(int nochdir, int noclose)
{
    pid_t pid;
    pid = fork();
    if (pid == -1)
        ERR_EXIT("fork error");

    if (pid > 0)
        exit(EXIT_SUCCESS);

    setsid();

    if (nochdir == 0)
        chdir("/");

    if (noclose == 0)
    {
        int i;
        for (i=0; i<3; ++i)
            close(i);
        open("/dev/null", O_RDWR);  //把守护进程 的标准输出关联到 进程的0号fd文件描述符上
        //复制0文件描述符给一个空闲的文件描述符
        dup(0); //标准输出 也指向/dev/null  //    dup2(0, 1);

        dup(0); //标准错误输出,也指向/dev/null //    dup2(0, 2);
    }
    return 0;

}

图片来自敬爱的老师:王保明

复制去Google翻译翻译结果

时间: 2024-10-12 08:00:46

[学习笔记]守护进程深入理解的相关文章

python学习笔记——守护进程

1 基本描述 守护进程:是系统中独立的后台服务进程, 特点:独立与终端并且周期性地执行某个任务,其生命周期长,一般随系统启动和终止. 缺点:进程的创建和销毁的时候需要消耗较多的计算机资源. 2 参考 Python实现守护进程 python中的daemon守护进程实现方法 python daemon守护进程实现 Python 守护进程 Python如何实现守护进程的方法示例 Python实例浅谈之五Python守护进程和脚本单例运行 原文地址:https://www.cnblogs.com/gen

Linux System Programming 学习笔记(五) 进程管理

1. 进程是unix系统中两个最重要的基础抽象之一(另一个是文件) A process is a running program A thread is the unit of activity inside of a process the virtualization of memory is associated with the process, the threads all share the same memory address space 2. pid The idle pro

Linux学习笔记033_11进程

ps:(process information,静态的) 显示进程信息,不加参数显示当前终端的进程 a:包括所有终端的进程 x:不属于任何终端的进程,和任何用户无关系的进程 u:显示出进程的拥有人 f:显示进程的附属关系(依赖关系,父子进程) USER:进程的拥有人 PID:进程ID,默认用进程ID排序 VSZ:程序在运行时调用多少虚拟内存 RSS:真实内存 TTY:?不属于任何终端,进入终端之前就运行 STAT:状态,s为睡眠 TIME:进程持续时间 COMMAND:运行这个进程的指令 ps

计算机操作系统学习笔记_2_进程管理 --进程与线程(上)

h3.western { font-family: "Liberation Sans",sans-serif; }h3.cjk { font-family: "微软雅黑"; }h3.ctl { font-family: "AR PL UMing CN"; }h2.western { font-family: "Liberation Sans",sans-serif; font-size: 16pt; }h2.cjk { fon

计算机操作系统学习笔记_4_进程管理 --处理机调度

h3.western { font-family: "Liberation Sans",sans-serif; }h3.cjk { font-family: "微软雅黑"; }h3.ctl { font-family: "AR PL UMing CN"; }h1 { margin-bottom: 0.21cm; }h1.western { font-family: "Liberation Sans",sans-serif; f

[原创]java WEB学习笔记27:深入理解面向接口编程

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

EM算法学习笔记2:深入理解

文章<EM算法学习笔记1:简介>中介绍了EM算法的主要思路和流程,我们知道EM算法通过迭代的方法,最后得到最大似然问题的一个局部最优解.本文介绍标准EM算法背后的原理. 我们有样本集X,隐变量Z,模型参数θ,注意他们3个都是向量,要求解的log似然函数是lnp(X|θ),而这个log似然函数难以求解,我们假设隐变量Z已知,发现lnp(X,Z|θ) 的最大似然容易求解. 有一天,人们发现引入任意一个关于隐变量的分布q(Z),对于这个log似然函数,存在这样一个分解: lnp(X|θ)=L(q,θ

Linux学习之守护进程详解

Linux系统守护进程详解                                                              ---转自:http://yuanbin.blog.51cto.com/363003/107306/,多谢分享 不要关闭下面这几个服务: acpid, haldaemon, messagebus, klogd, network, syslogd 1. NetworkManager, NetworkManagerDispatcher NetworkM

Python学习笔记 - day13 - 进程与线程

概述 我们都知道windows是支持多任务的操作系统. 什么叫"多任务"呢?简单地说,就是操作系统可以同时运行多个任务.打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行.还有很多任务悄悄地在后台同时运行着,只是桌面上没有显示而已. 现在,多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行多任务.由于CPU执行代码都是顺序执行的,那么,单核CPU是怎么执行多任务的呢? 答案就是操作系统轮流让各个任务交替执行,任