在第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. Codeforces 449B_Jzzhu and Cities

    给一个无向图,外加一些特殊的连接原点的无向边.在不改变原点与所有点的最短路的情况下,最多可以删除多少条特殊边? 首先我们把所有的边夹杂在一起.spfa跑出与所有点的最短路. 接下来我们通过一次bfs来 ...

  2. 使用 OpenGL API 播放 BIK 视频

    BIK作为在游戏中广泛使用的视频格式,这里就非常有必要普及一下了 直接贴代码,看注释吧.有不懂的地方就留言提问吧 /** * * 解码BIK视频文件为像素数据,使用PBO更新OpenGL纹理,绘制纹理 ...

  3. DAY4-Python学习笔记

    1.XML: 操作XML有两种方法:DOM和SAX DOM:把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点 SAX:是流模式,边读边解析,占用内存小,解析快,缺点是 ...

  4. Windows平台下在服务中添加MySQL

    widows下查看服务 1.桌面计算机-->右键-->管理-->计算机管理(本地)--->服务和应用程序-->服务 2.运行 中输入 services.msc 在服务中添 ...

  5. 一些说明&其他奇奇怪怪的东西

    NOIP考完了,这篇博客彻底咕了.

  6. java回文算法

    1987891这个就是回文,判断“1987891”是不是回文? 1 public static boolean isPalindrome(String str) { return str.equals ...

  7. Android 系统回收资源时进程被杀的优先级

    http://developer.android.com/guide/components/processes-and-threads.html#Processes Android 操作系统的内存回收 ...

  8. .Net Framework4.0 ashx页面报错:检测到有潜在危险的Request.Form值

    前些日子做项目的时候遇到一个问题,在ASP.NET 中使用JQuery的AJAX调用一般处理程序ashx出错,在处理程序中错误提示如下:从客户端(Text="<img alt=&quo ...

  9. sql service ---- update和delete 误操作数据 ---- 恢复数据

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/8491327 问题: 经常看到有人误删数据,或者误操作,特别是update和delete的 ...

  10. Typora 自定义主题 修改左右间距

    打开偏好设置,打开主题文件夹 比如要修改night主题中的间距,编辑night.css文件,修改#write样式即可. 修改其他样式类试.