【Linux】进程组、作业、回话、守护进程的基本概念!!

17人阅读 评论(0) 收藏 举报
分类:

进程组
每一个进程在创建的时候就有自己的进程ID,同时也有自己的ID(PGID)。一个进程组,可以含有一个或者多个进程,进程组也有自己的ID,通常是进程组里面第一个进程的ID。
进程组的特点:

  • 每一个进程组有一个组长进程,进程组长的ID等于进程组ID
  • 进程组长可以创建进程组、创建进程组里面的进程
  • 只要进程组里面含有进程,那么进程组就存在,这与进程组长的存在没有关系
  • 进程组里面的最后一个进程可以终止,也可以转移到其他的进程组
 #include <unistd.h>
 int setpgid(pid_t pid, pid_t pgid);
 pid_t getpgid(pid_t pid);
                             成功返回0,失败返回-1

getpgid:用来获取pid进程所在进程组的ID
setpgid:用来创建或将进程加入到指定的进程组
这里写图片描述
注:这里的3个sleep构成进程组,进程组长为3502。

会话
会话是由一个或者多个进程组组成的集合。
进程调用setsid函数用来创建一个新会话:

#include <unistd.h>
pid_t setsid(void);

注:调用该函数的进程不能够是进程组的组长(防止会话ID重复)。通常是先进行fork之后再调用setsid函数创建会话。

当调用setsid函数之后发生的事情:

  1. 调用setsid函数的进程成为新进程组的组长
  2. 该进程成为新会话的首进程,此时,该进程是新会话中的唯一进程
  3. 该进程没有控制终端
#include <unistd.h>
pid_t getsid(pid_t pid);

getsid:获得当前进程的会话ID。如果调用的进程不属于调用者所在的会话,那么调用的进程不能获得该会话ID。

作业控制
Shell的工作方式分为前台和后台,Shell控制的不是进程而是作业,在前台工作的作业,一次只能有一个,但是在后台工作的作业一次可以是很多个。
作业控制需要以下三种形式的支持:

  1. 支持控制作业的Shell
  2. 内核的终端驱动程序必须支持作业控制
  3. 内核必须提供对某些作业控制信号的支持

1、当我们在前台可以使用键盘发出信号使前台的作业终止,但是并不能使后台的作业发生终止。实际上有三个字符可使终端驱动产生信号:

  • 中断字符产生SIGINT
  • 退出字符产生SIGQUIT
  • 挂起字符产生SIGTSTP

2、只有前台作业可以接受终端的输入,如果后台作业试图读取终端的输入,那么终端驱动就会给后台作业发送SIGTTIN(15号)信号,同时停止该后台作业。

例如:将cat放在后台执行
这里写图片描述

当后台的作业处于stopped状态的时候,使用kill 命令发送信号的时候没有作用(除开9号信号),因为在发送信号之后再内核态到用户态的时候才会去处理信号,但是处于stopped状态的作业,只会停止不动,不会调用系统调用。

守护进程

守护进程也被称为精灵进程,本质是孤儿进程。是一种在后台执行的特殊进程。
在linux里面,其他的进程都会在运行结束或者系统注销之后终止,但是守护进程不受用户注销的影响,只要系统不关机,那么守护进程就会一直运行。

创建一个守护进程

  • 创建新的会话(使用setsid();),并让当前进程称为Session Leader
  • 用当前进程创建新的进程组,当前进程为进程组的组长。

也可以调用daemon函数创建守护进程

#include <unistd.h>
int daemon(int nochdir, int noclose);

nochdir:0表示更改当前工作目录,非0表示不更改
noclose:0表示关闭文件描述符,非0表示不关闭

注:守护进程之所以和用户注销没有关系,是因为用户注销销毁的是一个会话,而守护进程独自成会话、进程组,所以可以不受用户注销影响。

查看评论

linux多进程——进程组与会话、守护进程、信号通信

一、进程组与会话     进程组:是一个或多个进程的集合。可以调用 getpgid(0) 或 getpgrp() 来得到。进程组ID为组长的进程ID。只要进程组中有一个进程存在,进程组就存在,与...
  • fansongy
  • fansongy
  • 2011-10-10 19:20:44
  • 4156

进程组,作业与会话

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

进程、进程组、会话以及守护进程

1.进程、进程组与会话关系及其特性。 (1)  每个进程都有一个进程ID唯一识别(pid_t pid=getpid()); (2) 每个进程都属于一个进程组(getpgrp()),进程组属于一个会话(...
  • yuxue_23
  • yuxue_23
  • 2013-09-29 15:28:18
  • 2852

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

原文:http://www.cnblogs.com/ISeeIC/p/3624271.html Session(会话)与进程组 Shell 分前后台来控制的不是进程而是作业(Job)或者进程组(Pr...
  • carltraveler
  • carltraveler
  • 2017-02-06 09:49:31
  • 635

2进程之间的关系:进程组,会话,守护进程

1进程组 一个或过个进程的集合,进程组ID是一个正整数。用来获得当前进程组ID的函数。 pid_t getpgid(pid_t pid) pid_t getpgrp(void) 获得父子进程进...
  • toto1297488504
  • toto1297488504
  • 2014-09-21 01:33:18
  • 1614

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

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

Linux--进程组、会话、守护进程

1:进程组(一个或多个进程的集合)     #include     pid_t getpgrp(void);     getpgrp()用来取得目前进程所属的组识别码。     此...
  • kankan231
  • kankan231
  • 2014-04-16 13:16:54
  • 1420

进程组、会话、守护进程

(一).进程组进程组,也称为作业,代表一个或多个进程的集合。并且每个进程都属于一个进程组。当我们调用fork()函数创建子进程时,默认子进程与父进程属于同一个进程组,并且进程组ID等于组长进程ID,默...
  • Move_now
  • Move_now
  • 2017-02-14 18:08:10
  • 461

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

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

linux下的进程组会话作业的概念

进程组,会话,作业的概念 进程组是一个或者多个进程的集合; 会话是一个或者多个进程组的集合(一个会话中有一个前台进程组和零到多个后台进程组); 作业就是进程组,所以一个终端可以有多个...
  • wyzzgo
  • wyzzgo
  • 2017-03-27 22:01:21
  • 311
    个人资料
    持之以恒
    等级:
    访问量: 9957
    积分: 869
    排名: 5万+
    文章分类