进程组,作业,会话,精灵进程

原创 2016年07月31日 18:06:52

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

进程组里的第一个进程就是组长进程(下面例子中组长进程PGID=9843,也就是父进程)



2.作业
Shell分前后台来控制的不是进程而是作业(Job)或者进程组(Process Group)。一个前台作业可以由多个进程组成,一个后台也可以由多个进程组成,Shell可以运行一个前台作业和任意多个后台作业,这称为作业控制。
作业与进程组的区别:如果作业中的某个进程又创建了子进程,则子进程不属于作业。
一旦作业运行结束,Shell就把自己提到前台,如果原来的前台进程还存在(如果这个子进程还没终止),它自动变为后台进程组。

由上面的例子可以看出,当父进程退出后,子进程一直在执行(变为后台进程组 ,所以用Ctrl-c不能终止它);

jobs:查看作业号

fg %作业号 或者 fg %作业号:把作业放在前台运行

bg 作业号:把作业放在后台运行

3.会话
会话(Session)是一个或多个进程组的集合。一个会话可以有一个控制终端。这通常是登陆到其上的终端设备(在终端登陆情况下)或伪终端设备(在网络登陆情况下)。建立与控制终端连接的会话首进程被称为控制进程。一个会话中的几个进程组可被分为一个前台进程组以及一个或多个后台进程组。所以一个会话中,应该包括控制进程(会话首进程),一个前台进程组和任意后台进程组。

一次会话(一次登录就是建立一次会话)包括:

(1) 控制进程

(2) 一个前台进程组(可以是bash,会话首进程)

(3)一个或多个后台进程组

注意:每一次切换用户或重新打开一个终端,都会产生一个bash。


TTY:表示终端

S+:表示在前台sleep

S:表示在后台sleep

4 守护进程(又叫精灵进程)

守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。(一般以字母d结尾的进程大都是守护进程)

比较:

后台进程:与终端关联

精灵进程:与终端无关,自成会话(精灵进程属于后台进程)

创建精灵进程的一般步骤:

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

(2)调用fork,父进程退出(exit)。原因:1)如果该守护进程是作为一条简单的shell命令启动的,那么父进程终止使得shell认为该命令已经执行完毕。2)保证子进程不是一个进程组的组长进程。

(3)调用setsid创建一个新会话。setsid会导致:1)调用进程成为新会话的首进程。 2)调用进程成为一个进程组的组长进程。3)调用进程没有控制终端。(再次fork一次,保证daemon进程,之后不会打开tty设备)

(4)将当前工作目录更改为根目录。

(5)关闭不在需要的⽂文件描述符。

(6)其他:忽略SIGCHLD信号。

创建守护进程最关键的一步是调用setsid函数创建一个新的Session,并成为Session Leader。该函数调用成功时返回新创建Session的id(其实也就是当前进程的id),出错返回-1。注意,调用这个函数之前,当前进程不允许是进程组的Leader,否则该函数返回-1。要保证当前进程不是进程组的Leader也很容易,只要先fork再调用setsid就行了。fork创建的子进程和父进程在同一个进程组中,进程组的Leader必然是该组的第一个进程,所以子进程不可能是该组的第一个进程,在子进程中调用setsid就不会有问题了。

成功调用该函数的结果是:
(1) 创建一个新的Session,当前进程成为Session Leader,当前进程的id就是Session的id。
(2)创建一个新的进程组,当前进程成为进程组的Leader,当前进程的id就是进程组的id。
(3)如果当前进程原本有一个控制终端,则它失去这个控制终端,成为一个没有控制终端的进程。所谓失去控制终端是指,原来的控制终端仍然是打开的,仍然可以读写,但只是一个普通的打开文件而不是控制终端了。

创建一个精灵进程:


注意:如果在setsid()之后再次调用fork(),再次fork,终止父进程,保持子进程不是话首进程,从而保证后续不会在和其他终端关联。

精灵进程

了解daemon进程 这又是一个有趣的概念,daemon在英语中是"精灵"的意思,就像我们经常在迪斯尼动画里见到的那些,有些会飞,有些不会,经常围着动画片的主人公转来转去,啰里啰唆地提一些忠告,...
  • u010299726
  • u010299726
  • 2015-08-20 22:02:58
  • 146

unix环境高级编程_精灵进程

精灵进程 1.     精灵进程的定义让进程摆脱原会话的控制;让进程摆脱原进程组的控制;让进程摆脱原控制终端的控制;总之,就是让调用进程完全独立出来,脱离所有其他进程的控制。...
  • braveyly
  • braveyly
  • 2011-04-21 14:37:00
  • 863

【Linux】进程组、会话和精灵进程

对进程组、作业和会话进行说明。 1、进程组 2、作业 3、会话 4、精灵进程(或守护进程)...
  • Scenlyf
  • Scenlyf
  • 2016-08-04 10:19:06
  • 1474

进程组,作业与会话

一、进程组、作业、会话 1.进程组(process group)      每个进程除了有一个进程ID(保存在PCB当中),还属于一个进程组。进程组由一个或多个进程组成,通常和一个作业相关联,可以...
  • Sekai_Z
  • Sekai_Z
  • 2016-08-03 11:45:42
  • 1661

如何写一个简单的守护(精灵)进程原型

这里首先假设读者知道守护进程的大概概念,下面我们直接看程序。 //**************** 环境,OS = Ubuntu 10.4 编译器 = gcc 4.5.2 ***********...
  • ti_tantbx
  • ti_tantbx
  • 2011-11-28 15:00:10
  • 1183

精灵进程的创建

//代码1--实现延时--由于后台运行可能感觉不明显 //想要结束它,我只想到关机重启;查看的话,ps -ef #include   #include   #include   #include...
  • u013427969
  • u013427969
  • 2015-08-02 19:58:06
  • 274

《linux终端,会话组,进程组,作业,进程》

1. 关于终端的一些概念:终端,控制台,虚拟终端,伪终端,控制终端 2. 关于会话组的一些概念:会话,进程组,作业,进程...
  • miss_acha
  • miss_acha
  • 2015-02-13 11:15:55
  • 1195

【Linux】终端,进程组,作业,会话及作业控制

终端概念       在UNIX系统中,用用户通过终端登录系统后得到一一个Shell进程,这个终端成为Shell进程的控制终端 (Controlling Terminal),控制终端是保存在PCB中的...
  • lixungogogo
  • lixungogogo
  • 2016-08-03 02:00:55
  • 3481

C++如何实现启动一个进程并把该进程的标题改为我的标题

经常看到网上下载的单机游戏被别人加了个启动程序,在启动程序中加些广告其他的东西,还把游戏的标题都改了,自己也研究了下,其实也很简单,关键的一点无非就是找到启动的游戏窗口的句柄。 如果进程的标题确定,那...
  • wgxh05
  • wgxh05
  • 2017-01-12 11:47:26
  • 522

linux内核——会话、进程组、线程组

原文:http://www.cnblogs.com/ISeeIC/p/3624271.html Session(会话)与进程组 Shell 分前后台来控制的不是进程而是作业(Job)或者进程组(Pr...
  • carltraveler
  • carltraveler
  • 2017-02-06 09:49:31
  • 634
收藏助手
不良信息举报
您举报文章:进程组,作业,会话,精灵进程
举报原因:
原因补充:

(最多只允许输入30个字)