UNIX环境高级编程 第9章 进程关系
在第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章 进程关系的更多相关文章
- UNIX环境高级编程 第8章 进程控制
本章是UNIX系统中进程控制原语,包括进程创建.执行新程序.进程终止,另外还会对进程的属性加以说明,包括进程ID.实际/有效用户ID. 进程标识 每个进程某一时刻在系统中都是独一无二的,它们之间是用一 ...
- UNIX环境高级编程 第7章 进程环境
本章涉及C/C++程序中main函数是如何被调用的.命令行参数如何传递给main函数.程序的内存空间布局.程序如何使用环境变量.程序如何终止退出. main函数 C程序或C++程序总是从main函数开 ...
- UNIX环境高级编程 第13章 守护进程
守护进程daemon是一种生存周期很长的进程.它们通常在系统引导时启动,在系统关闭时终止.守护进程是没有终端的,它们一直在后台运行. 守护进程的特征 在Linux系统中,可以通过命令 ps -efj ...
- UNIX环境高级编程 第6章 系统数据文件和信息
UNIX系统的正常运作需要用到大量与系统有关的数据文件,例如系统用户账号.用户密码.用户组等文件.出于历史原因,这些数据文件都是ASCII文本文件,并且使用标准I/O库函数来读取. 口令文件 /etc ...
- UNIX环境高级编程 第5章 标准I/O库
本章是关于C语言标准I/O库的,之所以在UNIX类系统的编程中会介绍C语言标准库,主要是因为UNIX和C之间具有密不可分的关系.由于UNIX系统存在很多实现,而每个实现都有自己的标准I/O库,为了统一 ...
- UNIX环境高级编程 第1章 UNIX基础知识
所有操作系统都为运行在它之上的程序提供各种服务,典型的服务包括:执行新程序.打开文件.读写文件.分配存储空间.提供时间等. UNIX体系结构 严格来说,操作系统是一种软件,它控制计算机硬件资源,提供程 ...
- UNIX环境高级编程 第16章 网络IPC:套接字
上一章(15章)中介绍了UNIX系统所提供的多种经典进程间通信机制(IPC):管道PIPE.命名管道FIFO.消息队列Message Queue.信号量Semaphore.共享内存Shared Mem ...
- UNIX环境高级编程 第14章 高级I/O
这一章涉及很多概念和函数,包括:非阻塞I/O.记录锁.I/O复用.异步I/O.readv和writev函数以及内存映射. 非阻塞I/O 在Unix中,可以将系统调用分为两种,一种是“低速”系统调用,另 ...
- UNIX环境高级编程 第4章 文件和目录
第三章说明了关于文件I/O的基本函数,主要是针对普通regular类型文件.本章描述文件的属性,除了regular文件还有其他类型的文件. 函数stat.fstat.fstatat和lstat sta ...
随机推荐
- Python多线程获取返回值
在使用多线程的时候难免想要获取其操作完的返回值进行其他操作,下面的方法以作参考: 一,首先重写threading类,使其满足调用特定的方法获取其返回值 import threading class M ...
- POJ2699_The Maximum Number of Strong Kings
这题目,,,真是...诶.坑了好久. 给一个有向图.U->V表示U可以打败V并得一分. 如果一个人的得分最高,或者他打败所有比自己得分高的人,那么此人就是king. 现在给出每个人的得分,求最多 ...
- DAY3-Flask项目
1.jsonify: 得到了从API获得的数据并返回,API返回的json数据被转化成dict,我们还需要把dict序列化: return json.dump(result), 200, {'cont ...
- Vector源码解析
概要 学完ArrayList和LinkedList之后,我们接着学习Vector.学习方式还是和之前一样,先对Vector有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它.第1部分 Vec ...
- VDOM configuration
VDOM configuration 来源 https://cookbook.fortinet.com/vdom-configuration/ Posted on January 6, 2015 by ...
- PowerDesigner在生成SQL时报错Generation aborted due to errors detected during the verification of the mod
一.本章节要用到 ODBC连接数据库直接创建表,请先创建连接库的ODBC 请参考 新建 http://www.cnblogs.com/wdw31210/p/7580286.html 二.生成 去 ...
- 【刷题】BZOJ 1977 [BeiJing2010组队]次小生成树 Tree
Description 小 C 最近学了很多最小生成树的算法,Prim 算法.Kurskal 算法.消圈算法等等. 正当小 C 洋洋得意之时,小 P 又来泼小 C 冷水了.小 P 说,让小 C 求出一 ...
- 【转】ubuntu16.04安装ncurses-devel
在ubuntu16.04中编译内核时,使用make menuconfig发生错误,说没有安装ncurses-devel. 使用apt install ncurses-devel命令安装该库,没有,然后 ...
- 【51Nod1847】奇怪的数学题
记\(f(x)=\)\(x\)的次大因数,那么\(sgcd(i,j)=f(gcd(i,j))\). 下面来推式子: \[ \begin{aligned} \sum_{i=1}^n\sum_{j=1 ...
- linux内核分析 第八周 理解进程调度时机跟踪分析进程调度与进程切换的过程
笔记: 实验:使用gdb跟踪分析一个schedule()函数