本章看后给人似懂非懂的感觉,主要是不知道实际当中如何去使用。通过前面几章的学习,每个进程都有一个父进程,当子进程终止时,父进程得到通知并取得子进程的退出状态。先将本章基本的知识点总结如下,日后再看时候好好总结一下。

1、终端登录

  介绍了有终端登录Unix系统的过程。通过init进程读文件/etc/ttys,fork一个子进程调用exec执行getty程序进行登录,当用户输入完用户名后,getty的工作完成了,然后调用login程序,类似execle("/bin/login","login","-p",username,(char *)0,envp)。

2、网络登录

  经由内核的网络接口驱动程序,使用伪终端驱动程序,BSD中由inetd进程等待网络连接。具体过程为:inti进程调用一个shell,启动守护进程inetd,等待TCP/IP连接请求达到主机,当一个连接请求到达时,fork一个子进程进行执行相关程序。

3、进程组

  每个进程除了拥有一个进程ID外,还属于一个进程组,进程组是一个或多个进程的集合,每个进程组有一个唯一的进程组ID,可以通过getpgrp函数获取。每个进程组可以有一个组长进程,其进程组ID等于其进程ID。组长进程可以创建一个进程组,创建改组中的进程。通过setpgid函数添加一个现有的组或者创建一个新进程组。

4、会话

  会话(session)是一个或者多个进程组的集合,通常是由shell的管道线将几个进程编程一组。进程调用setsid函数创建一个新会话,getsid函数返回调用进程的会话首进程的进程组ID。

5、控制终端

  一个会话可以用一个控制终端;建立与控制终端连接的会话首进程称为控制进程;一个会话中的几个进程组可以分为前台进程组和后台进程组;一个会话中只有一个前台进程组,但可以有多个后台进程组;中断(Ctrl+C,SIGINT)、退出(Ctrl+/,SIGQUIT)和挂起(Ctrl+Z,SIGTSTP)字符产生的信号发送到前台进程组。

6、作业控制

  在一个终端上启动多个作业(进程组),控制作业在前后台运行。作业控制需要3个方面的支持和协作:(1)Shell本身的支持;(2)内核的终端驱动程序的支持;(3)内核对作业控制信号的支持。

7、shell执行程序

  采用ps命令输出进程ID,父进程ID,进程组ID,会话ID,命令。

ps -o pid,ppid,pgid,sid,comm

8、孤儿进程组

  一个父进程已经终止的进程称为孤儿进程(orphan process),这种进程由init进程收养。当一个控制进程结束后,其控制终端也会被释放,其他的session可以使用该终端作为控制终端。为了防止旧session中的进程尝试继续使用该终端,提出了孤儿进程组的概念。孤儿进程组就是指那些session leader已经终止,却还在继续执行的进程组。当进程组成为孤儿进程组时,内核会发送SIGHUP信号到该进程组中的所有进程。对于SIGHUP信号,默认情况下是终止进程。但用户可以捕捉此信号,从而不被终止,但是还是不能访问终端。孤儿进程组定义:改组中每个成员的父进程要么是该组的一个成员,要么不是该组所属会话的成员。一个进程组不是孤儿进程组的条件是:该组有一个进程,它的父进程在属于同一会话的另一个组中。

创建一个孤儿进程组程序如下:

 1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/wait.h>
4 #include <unistd.h>
5 #include <sys/types.h>
6 #include <errno.h>
7 #include <signal.h>
8
9 static void sig_hup(int signo)
10 {
11 printf("SIGHUP received,pid = %d\n",getpid());
12 }
13
14 static void pr_ids(char *name)
15 {
16 printf("%s: pid = %d,ppid = %d,pgrp = %d,tpgrp = %d\n",
17 name,getpid(),getppid(),getpgrp(),tcgetpgrp(STDIN_FILENO));
18 fflush(stdout);
19 }
20
21 int main()
22 {
23 char c;
24 pid_t pid;
25
26 pr_ids("parent");
27 if((pid = fork()) < 0)
28 {
29 perror("fork() error");
30 exit(-1);
31 }
32 else if(pid > 0)
33 {
34 sleep(5);
35 exit(0);
36 }
37 else
38 {
39 pr_ids("child");
40 signal(SIGHUP,sig_hup);
41 kill(getpid(),SIGTSTP);
42 pr_ids("child");
43 if(read(STDIN_FILENO,&c,1) != 1)
44 printf("read error form controlling tty,errno = %d\n",errno);
45 exit(0);
46 }
47 }

执行结果如下:

补充一下:

PID = 进程ID (由内核根据延迟重用算法生成)
PPID = 父进程ID(只能由内核修改)
PGID = 进程组ID(子进程、父进程都能修改)
SID = 会话ID(进程自身可以修改,但有限制,详见下文)
TPGID= 控制终端进程组ID(由控制终端修改,用于指示当前前台进程组)

僵尸进程:先于父进程终止,但是父进程没有对其进行善后处理(获取终止子进程有关信息,释放它仍占有的资源)。消灭僵尸进程的唯一方法是终止其父进程。
孤儿进程:该进程的父进程先于自身终止。其特点是PPID=1(init进程的ID)。一个孤儿进程可以自成孤儿进程组。

进程属于一个进程组,进程组属于一个会话,会话可能有也可能没有控制终端

Unix环境高级编程(八)进程关系的更多相关文章

  1. Unix环境高级编程——守护进程记录总结(从基础到实现)

    一.概念及其特征 守护进程是系统中生存期较长的一种进程,常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,在后台运行.守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程 ...

  2. UNIX环境高级编程--9. 进程控制

    进程关系    当子进程终止时,父进程得到通知并能取得子进程的退出状态. 终端登录:    早起UNIX系统通过哑终端登录,本地的终端 or 远程的终端 .主机上链接的终端设备是固定的,所以同时登录数 ...

  3. Unix环境高级编程(六)进程控制

    本章介绍Unix的进程控制,包括进程创建,执行程序和进程终止,进程的属性,exec函数系列,system函数,进程会计机制. 1.进程标识符 每一个进程都有一个非负整数标识的唯一进程ID.ID为0表示 ...

  4. Unix环境高级编程(五)进程环境

    本章主要介绍了Unix进程环境,包含main函数是如何被调用的,命令行参数如何传递,存储方式布局,分配存储空间,环境变量,进程终止方法,全局跳转longjmp和setjmp函数及进程的资源限制. ma ...

  5. UNIX环境高级编程--8. 进程控制

    进程控制进程标识:    每一个进程都有一个非负整型表示的唯一进程ID.虽然唯一,但是ID可以复用.当一个进程结束后,其进程ID会被延迟复用.    ID=0的进程通常是调度进程,常被称作交换进程(s ...

  6. UNIX环境高级编程——Linux进程地址空间和虚拟内存

    一.虚拟内存 分段机制:即分成代码段,数据段,堆栈段.每个内存段都与一个特权级相关联,即0~3,0具有最高特权级(内核),3则是最低特权级(用户),每当程序试图访问(权限又分为可读.可写和可执行)一个 ...

  7. UNIX环境高级编程——守护进程列表

    amd:自动安装NFS(网络文件系统)守侯进程apmd:高级电源治理Arpwatch:记录日志并构建一个在LAN接口上看到的以太网地址和ip地址对数据库Autofs:自动安装治理进程automount ...

  8. UNIX环境高级编程——守护进程

    一.守护进程简介 守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常常在系 ...

  9. (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

随机推荐

  1. 【HowTo ML】分类问题-&gt;神经网络入门

    非线性分类器(Non-linear hypotheses) 为什么使用非线性分类器 我们举几个栗子: 假如我们有一个数据空间如左上角坐标系所看到的,那么我们要的模型须要如右边公式所看到的的预測函数. ...

  2. Splunk的安装与使用

    一.简单介绍         Splunk 是机器数据的引擎.使用 Splunk 可收集.索引和利用全部应用程序.server和设备(物理.虚拟和云中)生成的高速移动型计算机数据 .从一个位置搜索并分 ...

  3. (转)ngui3.5.7 版本Scroll View实现方法

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://xyo123.blog.51cto.com/6369437/1405861 现在网 ...

  4. iOS开发系列课程预告

    近期在Mac和iOS上做开发,认为应该写一点东西分享给感兴趣的童鞋们.在此之前.以前有非常多同行们都在埋怨苹果Objective-C的复杂和难以上手,为此也有非常多人对今年(2014年)刚推出的Swi ...

  5. 翻译记忆软件-塔多思TRADO经典教程_4

    SDL Trados是世界上最流行的计算机辅助翻译(CAT) 软件,在全球拥有20万多客户,全球500强企业有超过90%的公司都在使用SDL Trados来为日常的本地化翻译工作服务.我们的使命是以强 ...

  6. POSIX 线程详解

    一种支持内存共享的简捷工具 POSIX(可移植操作系统接口)线程是提高代码响应和性能的有力手段.在本系列中,Daniel Robbins 向您精确地展示在编程中如何使用线程.其中还涉及大量幕后细节,读 ...

  7. js立即执行函数应用--事件绑定

    js中立即执行函数的应用:应用到事件绑定上. 少说多做,直接运行代码(代码中有注释): <!DOCTYPE html> <html lang="zh"> & ...

  8. 实战c++中的vector系列--将迭代器转换为索引

    stl的迭代器非常方便 用于各种算法. 可是一想到vector.我们总是把他当做数组,总喜欢使用下标索引,而不是迭代器. 这里有个问题就是怎样把迭代器转换为索引: #include <vecto ...

  9. jsp&html页面知识点集锦

      CreateTime--2016年12月16日16:08:03Author:Marydonjsp&html页面知识点集锦1.标签的class属性 标签同时拥有多个class时,要写在同一个 ...

  10. eclipse Java代码折叠工具

      eclipse Java代码折叠工具 CreateTime--2018年5月17日15点09分 Author:Marydon 1.问题描述 eclipse自带的代码折叠工具,无法折叠try{}ca ...