第三章学习笔记
一、什么是进程
在Linux系统中:触发任何一个事件时,系统都会将它定义成为一个进程,并且给予这个进程一个ID,成为PID,同时依据启动这个进程的用户与相关属性关系,给予这个PID一组有效的权限设定
如何产生进程:执行一个程序或指令
程序放在实体磁盘当中,然后透过使用者的执行来触发,触发后会加载到内存中成为一个个体,那就是进程,为了操作系统可管理这个进程,因此进程有给予执行者的权限、属性参数,并包括程序所需要的脚本与数据或文件数据等,最后在给予一个PID
关于子进程与父进程
在bash中再调用bash
注意:当父进程存在消灭子进程,父进程会主动再生成一支,要找出父进程并消灭
fork and exec进程呼叫流程
进程会有父进程以复制的方式产生一个一模一样的子进程,然后被复制出来的子进程再以exec的方式来执行实际要进行的程序,最终成为了一个子进程的存在
常驻在内存中的进程通常是负责一些系统所提供的功能以服务用户各项工作,这些常驻程序被称为:服务(daemon)
一般daemon类型的程序都会加上d在文件名后头
在单一bash接口下进行多个工作:
命令后加& 表示将命令放置于背景中执行
二、工作管理
工作管理(job control)当我们登入系统取得bash shell之后,在单一终端机接口下同时进行多个工作的行为管理
进行工作管理的行为中,其实每个工作都是当前bash的子进程,彼此之间是有相关性的,无法以job control 的方式由tty1的环境管理tty2的bash
脱机管理问题
在工作管理中提到的背景指的是在终端机模式下可以避免Ctrl+C中断的一个情景,若退出终端机工作不会继续
有两种脱机运行的办法,at和nohup
例子:nohup ./sleep500.sh &
将这个脚本运行在终端机背景中
三、进程管理
ps:观察某个时刻进程运作状态
只查阅自己bash进程的:ps -l
F:代表这个进程旗标(process flags)说明这个进程的总结权限
4表示此进程的权限为root
1表示此子进程仅进行复制(fork)而没有实际执行(exce)
S:代表这个进程的状态
UID、PID、PPID:拥有者ID、进程ID、父进程ID
C:CPU使用率,单位为百分比
PRI、NI:priority、nice的缩写,代表被CPU执行的优先级,数值越小代表该进程越快被CPU执行
ADDR、SZ、WCHAN:都与内存有关,ADDR是kernel function,指出该进程在内存的哪个部分,如果是个running的进程,一般显示 - ;SZ表示此进程用掉了多少内存,WCHAN表示目前进程是否在运作中, - 表示正在运作
TTY:登入者的终端机位置,若为远程登录则使用动态终端接口(pts/n);
TIME:使用掉的COU时间
CMD:造成此进程触发的指令
查阅所有系统运作的进程:ps aux
ps -lA 也比较常用
ps axjf列出类似进程树的进程显示,也可以使用pstree
僵尸进程
该进程应该已经执行完毕,或者因故应该要终止了,但是该进程的父进程却无法完整的将该进程结束掉,而造成那个进程一直存在内存当中
当CMD后面还接上<defunct>代表该进程是僵尸进程
top:动态观察进程的变化
将top的输出重定向到文件:top -b -n 2 > /tmp/top.txt
pstree:进程树
-A,-U是用ASCII码或者Unicode
-u,-p输出UID和PID
系统资源的观察
free:观察内存使用情况
uname:查阅系统与核心相关信息
uptime:观察系统启动时间与工作负载
netstat:追踪网络和插槽文件
netstat -tulnp 找出目前系统上已在监听的网络联机及其PID
dmesg:分析核心产生的讯息
vmstat:侦测系统资源变化
四、进程管理的系统调用
1、fork()
int pid = fork()
fork()创建子进程并返回子进程的pid。
2、进程终止
(1)正常终止:当内核中的某个进程终止时,他会将_exit(value)系统调用中的值记录为进程PROC结构体中的退出状态。并通知他的二父进程并使该进程成为僵尸进程。父进程课通过系统调用找到僵尸子进程,获得其pid和退出状态
pid=wait(int *status)
(2)异常终止:当某进程遇到异常时,他会陷入操作系统内核。内核的异常处理程序将陷阱错位类型转换为一个幻数,称为信号,将信号传递给进程,时进程终止。用户可以使用命令
kill -s signal_numeber pid
向通过pid识别的目标发送信号。
3、等待子进程终止
在任何时候,一个进程都可以使用
int pid = wait(int *status);
系统调用,等待僵尸子进程。
4、环境变量
各环境变量定义为:
关键字=字符串
重要环境变量:
SHELL=/bin/bash
TERM=xterm
USER=kcw
PATH=/usr/1oca1/bin:/usr/bin:/bin:/usr/local/games:/usr/games:./
HOME= / home /kcw
SHELL:指定将解释任何用户命令的sh。
TERM:指定运行sh时要模拟的终端类型。
USER:当前登录用户。
PATH:系统在查找命令时将检查的目录列表。
HOME:用户的主目录。在 Linux 中,所有用户主目录都在/home中。
在sh会话中,可以将环境变量设置为新的(字符串)值,如:
HOME= / home / newhome
可通过EXPORT命令传递给后代sh,如
expoert HOME
5、管道
管道时用于进程交换数据的单向进程件通信通道。管道有一个读取端和一个写入端。
1、管道命令处理
在Unix/Linux中,命令行
cmd1 | cmd2
sh将通过一个进程运行cmd1,并通过另一个进程运行cmd2,他们通过一个管道连接在一起,因此cmd1的输出变为cmd2的输入
2、命令管道
命令管道又叫FIFO
(1)在sh中,通过mknod命令创建一个命令管道:
mknod mypipe p
(2)或在c语言中发出mknod()系统调用
int r = mknod("mypipe",s_IFIFP,0);
(3)进程可像访问普通文件一样发个文命名管道。
六、实践与代码
ps -ef|grep root
fork函数演示
#include <unistd.h>
#include <stdio.h>
int main ()
{
pid_t fpid; //fpid表示fork函数返回的值
int count=0;
fpid=fork();
if (fpid < 0)
printf("error in fork!");
else if (fpid == 0) {
printf("i am the child process, my process id is %d\n",getpid());
printf("我是爹的儿子\n");//对某些人来说中文看着更直白。
count++;
}
else {
printf("i am the parent process, my process id is %d\n",getpid());
printf("我是孩子他爹\n");
count++;
}
printf("统计结果是: %d\n",count);
return 0;
}