【APUE】Chapter9 Process Relationships
这一章看的比较混乱,可能是因为例子少;再有就是,这一章就是一个铺垫的章节。
9.2 terminal logins
啥叫termnial? 我感觉书上的terminal指的更可能是一些物理设备(keyboard, modem这类的)
/etc/ttys里面存着这些终端,一行代表一个终端的信息。
限于基础知识有限,上面的内容可能理解的有误,但是对于terminal logins有一点是可以确定的:计算机事先知道有多少terminals可以logins。
其中BSD Terminal Logins是重点讲述的,其主要流程如下流程如下:
init (process ID 1)
⬇️ fork once per terminal;creates empty environment
init
⬇️ each child execs getty
getty
⬇️ opens terminal device; real user name; initial environment set;
login
⬆️
⬇️ file descriptor 0 1 2
terminal device driver
⬆️
⬇️ hard-wired connection
user at a terminal
在上面的过程中,可以看到Chapter 8 中fork exec的作用。
(1)先看到getty(包括getty)发生了什么
environment:init给getty的还是一个empty environment;getty自己create了一个environment再传给login,这个时候environment中就已经包含了terminal的信息了(如TERM)。
open terminal device: 打开terminal device,设定file descriptor 0 1 2 (input、output、error)
read user name: output类似“login:”等着用户输入
可以用下面的内容来理解getty:
execle("/bin/login", "login", "-p", username, (char*)0, envp);
最后getty调用了login program
(2)再看login做了哪些事情
a. 获取密码,校验密码。
b. 转换到这个用户的home路径
c. 把terminal device的ownship转换给用户
d. 设定groupid
e. ...
9.3 Network Logins
与terminal logins不同的是,计算机事先是不知道有多少,那些,谁,要network logins的。
因此,没有像/etc/ttys一行的terminal配置文件可以读。怎么办呢?这就要用一种类似service的方式去处理。
为了能够最终统一处理terminal和network的logins,unix系统中存在一种pseudo terminal的机智,可以翻译为虚拟终端。
为什么要有虚拟终端呢?
我觉得有两个原因:
1)作为终端用户,个人习惯来说,远程网络操作和terminal操作不希望有啥不同
2)作为unix系统,既然已经开发了terminal logins的程序,自然希望network logins的程序也能复用terminal logins的处理程序。因为二者除了登入的方式不同,一旦与系统发生交互,处理的内容都是类似的。
因此,pseudo terminal就出现了,完成了上述的诉求。即使从network logins的,只要login完成了,与terminal的操作并无两样。
下面只需要关注如何产生pseudo terminal的,流程如下。
init process ID 1
TCP connection request from TELNET client → ⬇️ executes the shell script /etc/rc
inetd
⬇️ fork (when connection request arrives from TELNET client)
inetd
⬇️
telnetd
⬇️
pseudo terminal device
⬇️ fork
parent process : handle the communication across the network connection
child process : does an exec of the login program
parent & child connected through the pseudo terminal
child process
⬆️
⬇️
login shell
上述的过程就是:
在系统的start-up阶段,init会执行一个/etc/rc的shell script,这个脚本的目的是启动inetd daemons。
随后,inetd daemons就一直等着,直到有来自telnet client的请求就fork出去一个小弟inetd去处理这个请求。
这个inetd小弟处理请求的方式是执行TELNET server,即telnetd。
随后telnetd随即打开一个pseudo terminal device,并且用fork的方式一分为二:
parent process : 负责管network connection的事情
child process : 负责管执行login相关的东西
parent 与 child 之间通过pseudo terminal来关联
9.4 Process Group
一堆process组成一个process group,猜测有process group是为了方便集体对某种类型的process进行集体操作。不细说。
9.5 Sessions
多个process groups构成了Session。
9.8 Job Control
这一部分书上有个了例子,从结果来看:不带job control的shell,一个terminal只能产生一个PGID;带job control的shell,一个terminal可以产生好几个PGID.
9.10 Orphaned Process Groups
由于缺乏后面signal的知识,就只看9.12这个代码。
代码不复杂,这里不详细记录了。
只说让我疑惑的地方。
...
signal(SIGHUP, sig_hup);
kill(getpid(), SIGTSTP);
...
源代码中有这么两行,是在fork后的child process中执行的。
先放着signal不管,这个kill就比较让人看着不好理解:都kill了,为什么child process后面的语句还能执行呢?
先man 2 kill一下:“kill - send signal to a process”。这才知道,kill做的事情是发送一个信号
那么再看一下发送的这个信号SIGTSTP是啥意思呢?
书上有这么一段话:“Unfortunately, the term stop has different meanings.....Therefore, the terminal driver calls the character that generates the interactive stop signal the suspend character, not the stop character”。
可以理解为:这里的stop并不是说直接给弄没了,而是先让这个进程等着的意思。
再回来看signal。
源代码中故意弄没了parent process,留着child process,这样就造成了orphaned process group的情况。按照系统的要求,对于orphaned process group中的所有的余留的进程,都会被发送一个hang-up的信号(SIGHUP),随后伴随着就SIGCONT的信号。signal这个语句就是为了能让child process接收到SIGHUP这个信号,并继续执行下去。
通过这个事情,这个kill跟他原来的意思还是差挺多的,还是要多注意一些。
【APUE】Chapter9 Process Relationships的更多相关文章
- 【APUE】Chapter8 Process Control
这章的内容比较多.按照小节序号来组织笔记的结构:再结合函数的示例带代码标注出来需要注意的地方. 下面的内容只是个人看书时思考内容的总结,并不能代替看书(毕竟APUE是一本大多数人公认的UNIX圣经). ...
- 【APUE】Chapter7 Process Environment
这一章内容是Process的基础准备篇章.这一章的内容都是基于C Programm为例子. (一)进程开始: kernel → C start-up rountine → main function ...
- 【APUE】Chapter10 Signals
Signal主要分两大部分: A. 什么是Signal,有哪些Signal,都是干什么使的. B. 列举了非常多不正确(不可靠)的处理Signal的方式,以及怎么样设计来避免这些错误出现. 10.2 ...
- 【C#】无损转换Image为Icon 【C#】组件发布:MessageTip,轻快型消息提示窗 【C#】给无窗口的进程发送消息 【手记】WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体 【手记】调用Process.EnterDebugMode引发异常:并非所有引用的特权或组都分配给呼叫方 【C#】DataRowState演变备忘
[C#]无损转换Image为Icon 如题,市面上常见的方法是: var handle = bmp.GetHicon(); //得到图标句柄 return Icon.FromHandle(handle ...
- 【APUE】Chapter16 Network IPC: Sockets & makefile写法学习
16.1 Introduction Chapter15讲的是同一个machine之间不同进程的通信,这一章内容是不同machine之间通过network通信,切入点是socket. 16.2 Sock ...
- 【手记】调用Process.EnterDebugMode引发异常:并非所有引用的特权或组都分配给呼叫方
刚上线一个新版本,其中有台电脑打开软件就报[xx的类型初始值设定项引发异常](还好不是一大波电脑,新东西上线就怕哀鸿遍野),如图: 显然是该类型的静态构造函数中抛异常了(红线处就是类名),遂打开该类, ...
- 【APUE】Chapter17 Advanced IPC & sign extension & 结构体内存对齐
17.1 Introduction 这一章主要讲了UNIX Domain Sockets这样的进程间通讯方式,并列举了具体的几个例子. 17.2 UNIX Domain Sockets 这是一种特殊s ...
- 【APUE】Chapter15 Interprocess Communication
15.1 Introduction 这部分太多概念我不了解.只看懂了最后一段,进程间通信(IPC)内容被组织成了三个部分: (1)classical IPC : pipes, FIFOs, messa ...
- 【APUE】Chapter14 Advanced I/O
14.1 Introduction 这一章介绍的内容主要有nonblocking I/O, record locking, I/O multiplexing, asynchronous I/O, th ...
随机推荐
- querystring处理参数小利器
相信上一章的讲解,相信大家对url地址有一个更直观的认识,在url解析的时候可以用querystring这样一个module替换,然后对这个query集成一个对象,这里不管是前端开发还是后端开发,都常 ...
- 某寺庙,有小和尚、老和尚若干。有一水缸,由小和尚用水桶从井中提水入缸,老和尚用水桶从缸里取水饮用。水缸可容10桶水,水取自同一井中。水井径窄,每次只能容一个水桶取水。水桶总数为3个。每次入、取缸水仅为1桶,且不可以同时进行。试用P、V操作给出小和尚、老和尚动作的算法描述。
寺庙和尚打水 设信号量mutex_gang, mutex_jing, gang_empty, gang_full, count分别表示使用缸互斥, 使用井互斥, 缸空, 缸满, 水桶总个数 semap ...
- Vue路由讲解
1>router-link和router-view组件 2>路由配置 a.动态路由 import Home from "@/views/Home.vue"; expor ...
- @NotEmpty@NotNull和@NotBlank的区别
这几个可以为对象,不只是字符串 1.@NotNull 不能为null,但可以为empty (""," "," ") 2.@NotEmpty ...
- window环境下安装node.js
在使用sublime text 3 过程中,node.js装了好几次都没有成功,今天终于成功了,现将安装过程整理一下. 安装过程中主要参考了以下代码: 第一,下载文件 https://nodejs.o ...
- Large-scale Scene Understanding (LSUN)
Large-scale Scene Understanding (LSUN) http://lsun.cs.princeton.edu/#organizers http://sunw.csail.mi ...
- machine learning学习笔记
看到Max Welling教授主页上有不少学习notes,收藏一下吧,其最近出版了一本书呢还,还没看过. http://www.ics.uci.edu/~welling/classnotes/clas ...
- UVa新汉诺塔问题(A Different Task,Uva 10795)
主要需要理递归函数计算 #define MAXN 60+10 #include<iostream> using namespace std; int n,k,S[MAXN],F[MAXN] ...
- C#+Winform开发窗体程序
学习笔记 第一章:winform基础 一.概述 1.Windows Form(简称WinForm) 是微软.NET平台下用于开发"图形界面"应用程序的组件. 2.C/S架构 客户机 ...
- scrapy--selenium(二)
今天学习了很多,还是想给大家讲一讲正题:scrapy的动态加载AJax的网页爬取:selenium.让我们开始 三: 针对大型电商网站:京东网,因为比较有代表性,爬出来有点小成就.先给大家看下效果图. ...