在第8章学习了进程的控制原语,通过各种进程原语可以对进程进行控制,包括新建进程、执行新程序、终止进程等。在使用fork( )产生新进程后,就出现了进程父子进程的概念,这是进程间的关系。本章更加详细地说明进程间的关系,包括:进程组、会话、作业等。

终端登录

当我们通过硬件终端而非网络终端登录到系统时,UNIX会有一个登录流程,该流程是个大概的过程,各个实现可能存在细微差别,但总体流程不变。

在通过终端登录时,init进程负责为每个终端fork一个子进程,由子进程对应登录终端设备。init进程会fork一份副本init,然后exec加载一个程序,该程序负责打开终端设备,后续用户通过该终端设备来与系统交互。当exec加载一个程序并打开终端之后,该程序提示用户输入用户名,之后再exec或者fork子进程来加载login程序进行登录,login程序负责验证密码,并通过读取配置文件来初始化用户终端环境。

网络登录

网络登录和终端不太相同,网络登录的需求衍生了伪终端,关于通过伪终端的登录将会在第19章说明。

进程组

每个进程都有一个进程ID。另外,每个进程都属于一个进程组。进程组是一个进程或多个进程的集合。和进程ID类似,每个进程组都有一个进程组ID,进程组ID等于组长进程ID,然而组长进程不一定会一直存在,组长进程可能在创建进程组之后结束,但组长进程结束之后,进程组依旧存在,此时没了组长。进程组的生命周期是从进程组创建开始,一直到最后一个组员离开。最后一个组员离开的方式有两种:一是组员结束死亡,二是组员脱离进程组,加入到它人的进程组。

UNIX提供了两个接口可以用于返回进程组的ID,还提供了一个创建或者加入别的进程组的接口,其头文件及函数原型如下:

#include <unistd.h>

pid_t getpgrp (void);

pid_t getpgid (pid_t pid);

int setpgid (pid_t pid, pid_t pgid);

对于第一个函数没有出错返回,其返回值是调用进程的进程组ID;

对于第二个函数,当参数为0时,成功则返回进程组ID,出错则返回-1。

对于第三个函数,成功时返回0,出错返回-1。

一个进程只能为自己或者它的子进程设置进程组ID,但子进程调用exec之后,执行了新程序,父进程就不能再为子进程设置进程组ID,因为exec执行的新程序可能与父进程再无任何关系。

会话

会话是一个或多个进程组的集合。通常是有shell将多个进程组成一个会话。进程也可以通过UNIX提供的接口来主动创建一个新会话。其头文件及函数原型如下:

#include <unistd.h>

pid_t setsid (void);

该函数成功是返回0,失败返回-1。

调用该函数的进程不能是一个进程组的组长,否则会失败。如果不是进程组组长,则该调用会创建一个新会话,并且调用进程称为会话leader,同时该调用会成为一个创建一个新进程组,并成为该新进程组的组长,最后该进程的会失去终端。

控制终端

一个会话最多只有一个控制终端,也允许没有终端。一个会话中的进程组可以被分为前台进程组以及一或多个后台进程组。如果会话有控制终端,那么该会话中就分为前台进程和后台进程,对终端的一些操作而引发的信号会发送到前端进程。

UNIX环境高级编程 第9章 进程关系的更多相关文章

  1. UNIX环境高级编程 第8章 进程控制

    本章是UNIX系统中进程控制原语,包括进程创建.执行新程序.进程终止,另外还会对进程的属性加以说明,包括进程ID.实际/有效用户ID. 进程标识 每个进程某一时刻在系统中都是独一无二的,它们之间是用一 ...

  2. UNIX环境高级编程 第7章 进程环境

    本章涉及C/C++程序中main函数是如何被调用的.命令行参数如何传递给main函数.程序的内存空间布局.程序如何使用环境变量.程序如何终止退出. main函数 C程序或C++程序总是从main函数开 ...

  3. UNIX环境高级编程 第13章 守护进程

    守护进程daemon是一种生存周期很长的进程.它们通常在系统引导时启动,在系统关闭时终止.守护进程是没有终端的,它们一直在后台运行. 守护进程的特征 在Linux系统中,可以通过命令 ps -efj ...

  4. UNIX环境高级编程 第6章 系统数据文件和信息

    UNIX系统的正常运作需要用到大量与系统有关的数据文件,例如系统用户账号.用户密码.用户组等文件.出于历史原因,这些数据文件都是ASCII文本文件,并且使用标准I/O库函数来读取. 口令文件 /etc ...

  5. UNIX环境高级编程 第5章 标准I/O库

    本章是关于C语言标准I/O库的,之所以在UNIX类系统的编程中会介绍C语言标准库,主要是因为UNIX和C之间具有密不可分的关系.由于UNIX系统存在很多实现,而每个实现都有自己的标准I/O库,为了统一 ...

  6. UNIX环境高级编程 第1章 UNIX基础知识

    所有操作系统都为运行在它之上的程序提供各种服务,典型的服务包括:执行新程序.打开文件.读写文件.分配存储空间.提供时间等. UNIX体系结构 严格来说,操作系统是一种软件,它控制计算机硬件资源,提供程 ...

  7. UNIX环境高级编程 第16章 网络IPC:套接字

    上一章(15章)中介绍了UNIX系统所提供的多种经典进程间通信机制(IPC):管道PIPE.命名管道FIFO.消息队列Message Queue.信号量Semaphore.共享内存Shared Mem ...

  8. UNIX环境高级编程 第14章 高级I/O

    这一章涉及很多概念和函数,包括:非阻塞I/O.记录锁.I/O复用.异步I/O.readv和writev函数以及内存映射. 非阻塞I/O 在Unix中,可以将系统调用分为两种,一种是“低速”系统调用,另 ...

  9. UNIX环境高级编程 第4章 文件和目录

    第三章说明了关于文件I/O的基本函数,主要是针对普通regular类型文件.本章描述文件的属性,除了regular文件还有其他类型的文件. 函数stat.fstat.fstatat和lstat sta ...

随机推荐

  1. 你好,OI

    高二了才开通真正意义上的博客...以前一直比较懒没写过什么,现在为了给自己留下一点回忆还是过来了. 上半年的那次失败还是历历在目啊...几个月来一直在我心中挥之不去.虽说也是自己的能力不足造成的,但是 ...

  2. Python 自动补全(vim)

    一.vim python自动补全插件:pydiction 可以实现下面python代码的自动补全: 1.简单python关键词补全 2.python 函数补全带括号 3.python 模块补全 4.p ...

  3. [BZOJ3712]Fiolki 重构树(并查集)

    3712: [PA2014]Fiolki Time Limit: 30 Sec  Memory Limit: 128 MB Description 化学家吉丽想要配置一种神奇的药水来拯救世界.吉丽有n ...

  4. POJ 2155 Matrix (矩形)

    date:公元2017年7月19日适逢周三: location:清北集训 杭州 point:二维树状数组/二维差分 Matrix Time Limit: 3000MS   Memory Limit:  ...

  5. Shell中[]里面的条件判断

    1.字符串判断 str1 = str2 当两个串有相同内容.长度时为真 str1 != str2 当串str1和str2不等时为真 -n str1 当串的长度大于0时为真(串非空) -z str1 当 ...

  6. BZOJ3835 [Poi2014]Supercomputer 【斜率优化】

    题目链接 BZOJ3835 题解 对于\(k\),设\(s[i]\)为深度大于\(i\)的点数 \[ans = max\{i + \lceil \frac{s[i]}{k}\} \rceil\] 最优 ...

  7. Typhoon-v1.02 靶机入侵

      0x01 前言 Typhoon VM包含多个漏洞和配置错误.Typhoon可用于测试网络服务中的漏洞,配置错误,易受攻击的Web应用程序,密码破解攻击,权限提升攻击,后期利用步骤,信息收集和DNS ...

  8. 压测工具-Jmeter

    server压力测试首选: Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域. 1 JMet ...

  9. java堆溢出

    java堆是用来存储对象实例的:只要不断创建对象,GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,当对象数量达到最大堆的容量限制的时候就会产生内存溢出异常.异常对战信息为OutOf ...

  10. 简短的创建Ajax对象代码

    假如你的脚本只针对某个浏览器开发,那么创建XMLHTTP是很简单的一件事,用XMLHttpRequest或者ActiveXObject即可.但事实上绝大多数的时候,我们都要考虑兼容,于是我们通常写成: ...