作业、终端、守护进程

作业:

一个或多个进程的集合,一个前台作业可以由多个进程组成,一个后台作业也可由多个进程组成。Shell真正控制的不是进程而是作业,Shell只能运行一个前台作业和任意多个后台作业,这为作业控制。

进程组:

每个进程都属于一个进程组,每个组都有唯一的进程组ID,每个进程组都有一个组长进程。只要某进程组的一个进程存在,该进程组就存在,与组长进程是否终止无关。

会话:

一个或多个进程组的集合,包括一个控制进程(会话首进程)、一个前台进程组和任意多个后台进程组。

终端:

用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端 (Controlling Terminal),控制终端是保存在PCB中的信息,调用fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。每打开一个终端,与该控制终端相关联的那个控制进程为bash(会话首进程)。每个进程通过一个特殊设备文件/dev/tty访问它的控制终端。

守护进程(精灵进程):

是在后台运行的一种特殊进程,它独立于控制终端(即与终端无关联),自成一个会话,不能进行前后台控制。

守护进程的用处:

Linux系统启动时会启动很多系统服务进程,例如网络登录过程中的inetd,这些系统服务进程没有控制终端,不能直接和用户交互。其它进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,它们一直在运行着。

创建守护进程最关键的是调用setsid函数创建一个新的Session,并成为Session Leader。

该函数调用成功时返回新创建的Session的id(其实也就是当前进程的id),出错返回-1。

注意,调这个函数之前,当前进程不允许是进程组的Leader,否则该函数返回-1。

成功调用该函数的结果是:

1. 创建一个新的Session,当前进程成为Session Leader,当前进程的id就是Session的id。

2. 创建一个新的进程组,当前进程成为进程组的Leader,当前进程的id就是进程组的id。

3. 如果当前进程原本有一个控制终端,则它失去这个控制终端,成为一个没有控制终端的进

程。所谓失去控制终端是指,原来的控制终端仍然是打开的,仍然可以读写,但只是一个普

通的打开文件而不是控制终端了。

守护进程的创建:

1.调用umask将文件模式创建屏蔽字设置为0

2.让init进程成为新产生进程的父进程,调用fork()创建子进程后,父进程立即退出,产生的子进程成为孤儿进程,并被init进程接管,同时所产生的新进程将变为在后台进行。

3.调用setsid函数,使得新创建的进程脱离控制终端,同时创建新的进程组,并成为该进程的首进程。setsid函数原型:pid_t setsid(void);

4.注册信号处理函数,使之对SIGCHLD信号进行忽略动作处理

5.再次fork,终止父进程,保持子进程不是话首进程,从而保证后续不会在和其他终端关联

6.关闭不需要的文件描述符,同时重定向三个标准文件描述符。

使用ps axj 命令查看系统中的进程

参数a表示不仅列当前用户的进程,也列出所有其他用户的进程,参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程,参数j表示列出与作业控制相关的信息。

查看该守护进程:使用ps axj | grep -E ‘my_daemon‘

可以看到该进程的TTY为?,表示这个程序无控制终端

时间: 2024-12-20 18:37:06

作业、终端、守护进程的相关文章

小何讲进程: 编写Linux守护进程方法详解

守护进程概述 守护进程,也就是通常所说的Daemon进程,是Linux中的后台服务进程. 它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些事件的发生. 守护进程常常在系统引导载入时启动,在系统关闭时终止. Linux有很多系统服务,大多数服务都是通过守护进程实现的.守护进程的名字通常以d结尾,字母d就是Daemon的意思. 由于在Linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端

守护进程设计

课程索引 什么是守护进程 守护进程, 也就是通常说的Daemon( 精灵) 进程,是Linux中的一种服务进程. 它的特点是:•不占用控制终端(后台 运行)•独立于控制终端•独立于控制终端•周期性运行例如: smb 设计要素 2. 1 后台运行 守护进程需要独立于任何一个控制终端.实现方法调用是通过创建子进程来充当守护进程,而父进程退出,这样子进程就可以在后台运行.(范例展示)pid=fork();if(pid>0)if(pid>0)exit(0); //父进程退出else (pid==0){

【LINUX】 会话 进程组 作业 终端

[进程组]  进程组是一个或多个进程的集合.每个进程除了有一个进程ID之外,还属于一个进程组.  每个进程组有一个唯一的进程组ID.每个进程组都可以有一个组长进程. 组长进程的进程组ID等于其进程ID.进程组是否存在和有无组长无关. 每个进程都是属于进程组的,没有独立的进程,除非该进程组中只有一个进程,则可以说这个进程是独立的. 组长进程可以创建一个进程组,创建该组中的进程,然后终止. 但是只要有一个进程存在,则这个进程组就存在,这与其组长进程是否终止无关. 通常,它们与同一作业相关联,可以接收

终端、作业控制与守护进程

进程组.作业.会话 1.1 进程组(Process Group) a. 每个进程除了有一个进程ID之外,还属于一个进程组.进程组是一个或多个进程的集合.通常,它们与同一作业相关联,可以接收来自同一终端的各种信号. b. 每一个进程组有一个进程组id和一个组长进程,组长进程的id即为进程组id. c. 组长进程可以创建一个进程组. d. 只要进程组还有一个进程存在,则进程组存在,与组长进程是否终止无关. 1.2 作业(Job) a. Shell分前后台来控制的不是进程而是作业或者进程组. b. S

作业、进程组、会话和守护进程

1. 进程组 每个进程除了有一个进程ID之外,还属于一个进程组.进程组是一个或多个进程的集合.通常,它们与同一作业相关联,可以接收来自同一终端的各种信号.每个进程组有一个唯一的进程组ID.每个进程组都可以有一个组长进程.组长进程的标识是,其进程组ID等于其进程ID.组长进程可以创建一个进组,创建该组中的进程,然后终止.只要在某个进程组中一个进程存在,则该进程组就存在,这与其组长进程是否终止无关. 2.作业 Shell分前后台来控制的不是进程而是作业(Job)或者进程组(Process Group

Linux中 终端、作业控制与守护进程

1. 进程组 每个进程除了有一个进程 ID之外,还属于一个进程组.进程组是一个或多个进程的集合. 通常,它们与同一作业相关联,可以接收来自同一终端的各种信号. 每个进程组有一个唯 一的进程组ID.每个进程组都可以有一个组长进程.组长进程的标识是,其进程组 ID等于 其进程ID. 组长进程可以创建一个进程组,创建该组中的进程,然后终止. 只要在某个进程组中一个 进程存在,则该进程组就存在,这与其组长进程是否终止无关. 2.作业 Shell分前后台来控制的不是进程而是 作业(Job)或者进程组( P

从进程组、会话、终端的概念深入理解守护进程

一.写在前面 「守护进程」是 Linux 的一种长期运行的后台服务进程,也有人称它为「精灵进程」.我们常见的 httpd.named.sshd 等服务都是以守护进程 Daemon 方式运行的,通常服务名称以字母d结尾,也就是 Daemon 第一个字母.与普通进程相比它大概有如下特点: 无需控制终端(不需要与用户交互) 在后台运行 生命周期比较长,一般是随系统启动和关闭 二.守护进程必要性 为什么要设置为守护进程,普通进程不可以吗? 当我们在命令行提示符后输入类似./helloworld程序时,在

守护进程接收终端输入的一种变通性方法(二)

前言 本文作为<守护进程接收终端输入的一种变通性方法>的补充版,主要讨论不使用第三方库时,如何支持字符终端命令行的退格和历史记录.文中涉及的代码运行环境如下: 一  退格键 术语“退格”(BS,BackSpace)本意指删除光标左侧的一个字符.最初的打字机中,退格键将机架(carriage)回退一个位置:而在现代计算机系统中,退格键将显示器光标左移一个位置,并删除该处的字符,然后将该处之后的文字左移一个位置. 删除(DEL,Delete)键可追溯到计算机使用打孔磁带的年代.当时,纠正一个字符打

守护进程接收终端输入的一种变通性方法

说明 本文主要介绍某嵌入式产品中DSL用户态驱动模块作为守护进程时,如何接收终端输入的变通性方法. 出于信息安全考虑,文中涉及系统方面的接口函数未给出实现细节,但不影响表述的完整性. 相关性文章参见<GNU Readline库函数的应用示例>. 一  背景知识 init进程(如Busybox init)是嵌入式系统内核自举时启动的第一个也是惟一的用户进程.init进程是后续所有其他进程的父进程(其进程ID为1),在系统运行期间以守护进程的形式一直存在.它主要负责启动各运行层次特定的系统服务(如