用于创建和使用进程的系统调用有fork、exec、wait和exit。
举例:shell运行外部命令时,先fork调用创建当前进程的一个副本。子进程使用exec将他自身从运行shell的进程变成运行外部程序的进程。其次,父进程使用wait系统调用暂停执行,直到子进程结束执行。最后,外部程序结束,子进程使用exit终止自身的执行。子进程释放所有资源,但保留相关数据条目,成为一种数据结构——僵尸进程。若父进程执行了wait则此时父进程立即被内核唤醒查看相关僵尸进程的执行数据,然后移除僵尸进程条目。若父进程没有执行wait且没有被杀,那么僵尸进程将会保留。
子进程运行时,父进程意外死亡会使子进程称为孤儿进程。孤儿进程被init收养,称为init的子进程。所以处理上面僵尸进程的一种方法是杀死其父进程,使其称为孤儿僵尸进程而被init收养,有init清除他的残留数据。
上面说进程调用fork生成一个副本即子进程。父进程等待,子进程运行程序。fork调用后,父进程返回他的PID,子进程返回为0.这就区分了父进程与子进程。
作业控制
作业控制是一项由shell支持的特性,允许执行多项作业,一个在前台执行,其他在后台运行。(当你在命令的末尾加一个&, 不必等该命令程序执行完毕,而可以立即输入运行其他命令)。
作业与进程的区别是他指整个命令行所需的全部进程。进程由内核控制,而作业由shell控制。如
who | cut -c 1-8 | sort | uniq -c 和 data;who;uptime;cal 12 2008;
第一条命令是一个管道线,生成4个进程,被认为是一个作业。第二个是四个进程。
fg 挂起作业
每个作业处于前台执行、后台执行、待续。使用fg可将改程序返回前台。使用bg将作业移至后台。
suspend命令将shell中的当前程序挂起。
jobs显示作业列表
jobs显示所有作业列表。
ps程序 显示进程信息
-A 显示所有进程(等价于-e)(utility)
-a 显示一个终端的所有进程,除了会话引线
-N 忽略选择。
-d 显示所有进程,但省略所有的会话引线(utility)
-x 显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。(utility)
-p pid 进程使用cpu的时间
-u uid or username 选择有效的用户id或者是用户名
-g gid or groupname 显示组的所有进程。
U username 显示该用户下的所有进程,且显示各个命令的详细路径。如:ps U zhang;(utility)
-f 全部列出,通常和其他选项联用。如:ps -fa or ps -fx and so on.
-l 长格式(有F,wchan,C 等字段)
-j 作业格式
-o 用户自定义格式。
v 以虚拟存储器格式显示
s 以信号格式显示
-m 显示所有的线程
top、prstat监视系统进程
显示重要的动态的进程信息 cpu信息
pstree显示进程树
pstree [-aAcGnpu] [pid | userid]
kill杀死进程 向进程发送信号
可以用ps显示进程ID 然后用kill ID杀死
kill -STOP 进程 用来想这个进程发送信号STOP
nice改变进程优先级
nice以一个较低的优先级运行程序
renice改变现有进程的优先级
renice niceness -p PID
守护进程
大多数进程不是由用户 运行的程序。这些不与终端相连的后台运行的程序成为守护进程(对应windows的服务程序)。守护进程执行系统所需的大量任务,等待事件的发生。