阅读更多
1 如何创建进程
两个系统调用(这是Linux创建进程的唯一途径)
fork:以当前进程作为原型进行复制,几乎包含进程的所有相关信息,包括代码和数据exec:将当前进程空间的数据完全替换为另一个进程的数据
Linux提供了一系列的机制和策略
- 机制就是原子操作,所有Linux支持的系统调用都可以理解为一种机制
- 策略是将这些机制进行组合达到最终的目的,在Linux中创建进程的策略就是通过
fork+exec
2 进程父子关系
父进程可以通过fork+exec来创建子进程,例如进程A创建了进程B,那么此时进程B的父进程就是进程A
那么当进程A退出之后,进程B的父进程该如何变化呢?
情景1
1 | # 通过shell执行一个后台进程 |
情景2
1 | # 通过shell执行一个后台进程 |
情景3
1 | # 通过shell执行一个后台进程,且使用nohup |
情景4
1 | # 编写脚本 |
情景5
1 | # 编写脚本 |
总结:
- 通过
情景1和情景2的对比,我们可以发现,只有当父进程(在这里就是bash进程)收到了hup信号时,才会终止所有子进程 - 通过
情景2和情景3的对比,我们可以发现,当使用nohup时,即便bash收到了hup信号,也不会杀死该nohup的子进程 - 通过
情景4和情景5的对比,我们可以发现,在shell中执行脚本,其实是用#!/bin/sh指定的shell来执行对应的脚本,脚本中进程的父进程就是/bin/sh这个shell,且退出后没有收到hup信号时,不会杀死子进程 - 子进程的父进程终止后,子进程的父进程会变为1
- 在shell(这里就是
bash)中执行命令,其简单过程如下:bash进程收到标准输入bash进程通过执行fork+exec两次系统调用来启动子进程bash编写了一套信号处理函数,当收到了hup信号时,会终止对应的子进程
nohup command args...这个命令执行过程如下bash进程收到输入nohup command args...,通过系统调用fork+exec启动子进程nohupnohup进程收到入参command args...,首先注册hup信号的处理方法(该方法会忽略hup信号),然后通过系统调用fork+exec启动子进程command- 当
bash收到hup信号时,会将hup信号传递给子进程,而此时由于子进程已经注册了特殊的hup信号处理方法,于是将hup信号忽略,子进程得以存活
3 进程、进程组、会话、终端、tty、作业、前台、后台
3.1 终端(terminal)
终端(termimal)= tty(Teletypewriter,电传打印机),作用是提供一个命令的输入输出环境,在linux下使用组合键ctrl+alt+T打开的就是终端,可以认为terminal和tty是同义词
3.2 shell
shell是一个命令行解释器,是linux内核的一个外壳,负责外界与linux内核的交互。shell接收用户或者其他应用程序的命令, 然后将这些命令转化成内核能理解的语言并传给内核,内核执行命令完成后将结果返回给用户或者应用程序。当你打开一个terminal时,操作系统会将terminal和shell关联起来,当我们在terminal中输入命令后,shell就负责解释命令
3.3 console
在计算机发展的早期,计算机的外表上通常会存在一个面板,面板包含很多按钮和指示灯,可以通过面板来对计算机进行底层的管理,也可以通过指示灯来得知计算机的运行状态,这个面板就叫console。在现代计算机上,在电脑开机时(比如ubuntu)屏幕上会打印出一些日志信息,但在系统启动完成之前,terminal不能连接到主机上,所以为了记录主机的重要日志(比如开关机日志,重要应用程序的日志),系统中就多了一个名为console的设备,这些日志信息就是显示在console上。一台电脑有且只有一个console,但可以有多个terminal。举个例子,电视机上的某个区域一般都会有一些按钮,比如开机,调音量等,这个区域就可以当做console,且这个区域在电视上只有一个,遥控器就可以类比成terminal,terminal可以有多个
3.4 bash
linux系统上可以包含多种不同的shell(可以使用命令cat /etc/shells查看),比较常见的有Bourne shell(sh)、C shell (csh)和Korn shell(ksh),三种shell都有它们的优点和缺点。Bourne shell的作者是Steven Bourne,它是UNIX最初使用的shell并且在每种UNIX上都可以使用。bash的全称叫做Bourne Again shell,从名字上可以看出bash是Bourne shell的扩展,bash与Bourne shell完全向后兼容,并且在Bourne shell的基础上增加和增强了很多特性,如命令补全、命令编辑和命令历史表等功能,它还包含了很多C shell和Korn shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。总而言之,bash是shell的一种,是增强的shell