Linux多任务编程(七) Linux守护进程及其基础实验

守护进程概述

守护进程,又叫daemon进程(不知怎的,我突然想起来吸血鬼日记中的达蒙了,很好 看的美剧),是Linux中的后台服务进程。他是一个生存期较长的进程,通常独立于控制终端并且周期性地执行 某种任务或者等待处理某些发生的事件。守护进程常常在系统引导载入时启动,在系统关闭时终止。Linux有 很多系统哦服务,大多数服务都是通过守护进程实现的。同时,守护进程还能完成许多系统任务,例如,作业 规划进程cronf、打印进程lqd等(这里的结尾字母 d 就是 daemon的意思)。

在Linux中,每一个系统 与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端称为这些进 程的控制终端,当控制终端关闭时,相应的进程都会自动关闭。但是守护进程却能够突破这种限制,它从被执 行开始运转,直到接收到某种信号或者整个系统关闭时才退出。如果想让某个进程不因为用户、终端或者其它 的变化而受到影响,那么就必须把这个进程变成一个守护进程。可见,守护进程是非常重要的。

编写 守护进程步骤

编写守护进程遵循一个特定的流程,下面就说一下守护进程的创建步骤。

1、创 建子进程,父进程退出。

这是编写守护进程的第一步。由于守护进程是脱离控制终端的,因此,完成 第一步后就会在shell终端造成一种程序已经运行完毕的假象,之后的所有工作都在子进程中完成,而用户在 shell终端则可以执行其他的命令,从而在形式上做到与控制终端的脱离。

但是,父进程创建了子进程 后退出,此时该子进程不就没有父进程了吗?守护进程中确实会出现这么一个有趣的现象:由于父进程已经先 于子进程退出,就会造成子进程没有父进程,从而变成一个孤儿进程。在Linux中,每当系统发现一个孤儿进 程时,就会自动由1号进程(也就是 init 进程)收养它,这样原先的子进程就会变成 init 进程的子进程。其 关键代码如下;

2、在子进程中创建新会话  

这个步骤是创建守护进程最重要的一步,虽然实现非常简单,但意义却非常重大。在这里使用 的是系统函数 setsid(),在具体介绍 setsid()之前,先了解以下两个概念:进程组和会话期。

进程 组。进程组是一个或多个进程的集合。进程组由进程组ID来唯一标识。除了进程号PID之外,进程组ID也是一 个进程的必备属性。每隔进程组都有一个组长进程,其组长进程的进程号PID等于进程组ID,且该进程组ID不 会因为组长进程的退出而受到影响。(组长没了,再找个组员来担任组长呗)

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

接下来具体介绍 setsid()的相关内 容。

① setsid()函数的作用。setsid()函数用于创建一个新的会话组,并让执行此函数的进程担任该 会话组的组长。调用setsid()有以下3个作用:

让进程摆脱原会话的控制

让进程摆脱原进程 组的控制

让进程摆脱原控制终端的控制

那么,回过头来想想,在创建守护进程时为什么要调 用 setsid()函数呢?是这样的,在创建守护进程的第一步中,调用了fork()函数创建子进程再令父进程退出 。由于在调用 fork()函数时,子进程全盘复制了父进程的会话期、进程组和控制终端等,虽然父进程退出了 ,但原先的会话期、进程组和控制终端等并没有改变,因此,还不是真正意义上的独立。而setsid()函数能够 使进程完全独立出来,从而脱离所有其他进程的控制。

② setsid函数格式

时间: 2024-10-26 06:05:12

Linux多任务编程(七) Linux守护进程及其基础实验的相关文章

Linux多任务编程(一) 任务、进程、线程

Linux下多任务介绍 首先,先简单的介绍一下什么叫多任务系统?任务.进程.线程分别是什么? 它们之间的区别是什么?,从而可以宏观的了解一下这三者,然后再针对每一个仔细的讲解. 什么叫 多任务系统?多任务系统指可以同一时间内运行多个应用程序,每个应用程序被称作一个任务. 任务 定义:任务是一个逻辑概念,指由一个软件完成的任务,或者是一系列共同达到某一目的的操作. 进程 定义:进程是指一个具有独立功能的程序在某个数据集上的一次动态执行过程,它是系统进行资源分配和调度 的最小单元. 线程定义:线程是

linux下Shell编程--标准的守护进程的启动脚本

一个标准的守护进程的启动脚本: #! /bin/sh WHOAMI=`whoami` PID=`ps -u $WHOAMI | gerp mydaemond | awk '{print $1}'` if (test "$1" = "") then echo "mydaemond [start][stop][version]" exit 0 fi if ( test "$1" = "status") then

Linux多任务编程(四) exit()函数及其基础实验

exit()和_exit()函数 函数说明 创建进程使用fork()函数,执行进程使用exec函数族,终止 进程则使用exit()和_exit()函数.当进程执行到exit()或_exit()函数时,进程会无条件的停止剩下的所有操 作,清除各种数据结构,并终止本进程的运行.但是,这两个函数还是有区别的,其调用过程如图1所示: 从图1可以看出,_exit()函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其 在内核中的各种数据结构:而exit()函数则在这些基础上做了一些包装,在执行

Linux多任务编程(二) fork()函数及其基础实验

fork()函数 在 Linux 中创建一个新进程的唯一方法是使用fork()函数.fork()函数是 Linux 系统中 一个非常重要的函数,和咱们以前遇到过的函数由一些区别,因为它看起来执行一次却返回两个值,这又作何 解释?不着急,慢慢看. 函数说明 fork()函数用于从已存在的一个进程中创建一个新的进程 ,新进程称为子进程,而原进程称为父进程.使用fork()函数得到的子进程是父进程的一个复制品,它从父进 程处继承了整个进程的地址空间,包括进程上下文.代码段.进程堆栈.内存信息.打开的文

【Linux系统编程】 Linux系统调用概述

系统调用概述 系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组"特殊"接口.用户程序可以通过这组"特殊"接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件.关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等. 从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口--它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间. 系统服务之所以需要通过系统调

Linux多任务编程(六) 编写多进程程序及其代码

实验目的 通过编写多进程程序,熟练掌握fork().exec().wait()和waitpid()等函数的使用,进一步 理解在Linux中多进程编程的步骤. 实验内容 该实验有3个进程,其中一个为父进程,其余两个 是该父进程创建的子进程,其中一个子进程运行"ls -l"指令,另一个子进程在暂停5s后异常退出.父进程 先用阻塞方式等待第一个进程的结束,然后用非阻塞方式等待另一个子进程的退出,待收集到第2个子进程结 束的消息后,父进程就返回. 实验步骤 该实验的流程图如下 实验源代码 先看

Linux多任务编程(五) wait()、waitpid()函数及其基础实验

wait()和waitpid() 函数说明 wait()函数用于使父进程(也就是调用wait()的进程)阻塞,直到 一个子进程结束或者该进程接收到了一个指定的信号为止.如果该父进程没有子进程或者它的子进程已经结束 ,则wait()函数就会立即返回. waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子 进程(它可以指定需要等待终止的子进程),它还有若干选项,如可提供一个非阻塞版本的 wait()功能,也 能支持作业控制.实际上,wait()函数只是 waitpid()函数

Linux多任务编程(三) exec函数族及其基础实验

exec函数族 函数族说明 fork() 函数用于创建一个新的子进程,该子进程几乎复制了父进程的全 部内容,但是,这个新创建的子进程如何执行呢?exec 函数族就提供了一个在进程中启动另一个程序执行的 方法.它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段.代码段和堆栈 段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了.另外,这里的可执行文件 既可以是二进制文件,也可以是Linux下任何可执行的脚本文件. 在 Linux 中使用exec函数族主

Linux多线程编程和Linux 2.6下的NPTL

这几天由于工作需要,琢磨了一下Linux下的多线程的相关资料.Linux下最常用的多线程支持库为Pthread库,它是glibc库的组成部分.但是关于Pthread的说明文档非常缺乏,特别是对POSIX多线程规范的介绍以及pthread库中多线程实现方式的介绍实在是少之又少.而多线程编程对于系统程序员而言是必须掌握的技术,因此总是让学习中的程序员觉得头痛不以.我自己也没有太多多线程编程的经验,在这里只是把自己收集到的一些关于Linux上多线程还算新的资料进行汇总来抛砖引玉,以便相互学习交流. 这