1、进程和程序
程序是一个可执行文件,而一个进程是一个执行中的程序实例。一个进程对应于一个程序的执行,进程是动态的,程序是静态的,多个进程可以并发执行同一个程序。比如几个用户可以同时运行一个编辑程序,每个用户对此程序的执行均作为一个单独的进程。
2、进程控制的系统调用
一个进程可以启动另一个进程,进程之间形成层次结构,而进程树的顶端是一个控制进程,一个名为Init的程序的执行,该进程是所有用户进程的祖先。主要的系统调用有
- fork() 通过复制调用进程来建立新的 进程,是最基本的进程建立操作
- exec 包含一系列的系统调用,通过用一个新的程序覆盖原内存空间来实现进程的转变
- wait() 提供初级的进程同步措施,使一个进程等待,直到另一个进程结束为止
- exit() 终止一个进程的实现
3、进程的建立
进程的创建是通过调用fork()来创建,创建进程的那个进程成为父进程,创建出来的新的进程成为子进程,pid = fork(),返回值为进程标识符,如果返回的非零整数,则表明是父进程,返回的是0,则为子进程。
4、进程的运行
exec系列中的系统调用完成将一个新程序装入调用进程的内存空间,来改变调用进程的执行代码,从而形成新的 进程。exec调用成功,那么调用进程则会被覆盖,然后从新程序的入口开始执行,但其进程标识符与调用进程相同。
所以,exec调用成功后无任何数据返回,这与fork()不同
5、进程的终止
系统调用exit()实现进程的终止,成功返回0,出错则返回非0值,exit()除了停止进程外,还可以关闭所有已打开的文件,若父进程因执行了wait()调用而处于睡眠状态,那么子进程执行exit()会重新启动父进程运行,另外,exit()还将完成一些系统内部的清除工作,例如缓冲区的清除工作等
除了exit()外,当进程运行完其程序到达main函数末尾时,进程会自动终止,当进程在main函数内执行一个return语句时,也会终止。当然还有一个_exit()函数也可以终止进程,其与exit()相同,但没有系统内部的清除工作。
进程终止的特殊情况:
1)子进程终止时,父进程并不正在执行wait()调用。
2)当子进程尚未终止时,父进程却终止了。一般允许父进程终止,并把它的子进程交给系统的初始化进程所属
6、进程的同步
使用wait()是实现进程同步的简单手段
7、进程的优先级
通过nice()调整进程的优先数,如nice(5)则是增加优先数,优先数越大,进程优先权就越低,所以nice()输入一个正数是降低了进程从优先权,普通进程只能降低优先权,超级用户可以通过输入一个负值,比如nice(-1)来增加优先权
8、守护进程
守护进程是一种后台运行并且独立于所有终端控制之外的进程,有很多守护进程,执行着各种系统服务和管理的任务,那么为什么要独立于终端之外的进程呢?
1)安全性考虑----进程执行信息不显示在任何一个终端上
2)不被打断----避免进程被终端的中断信号打断
3)方便转入后台---可以通过&将程序转为后台执行,有时也希望程序能够自动将其转入后台执行
9、守护进程的启动
1)通过系统的初始化脚本启动------脚本目录通常在etc/rc.d下,这种守护进程有超级用户权限
2)通过inetd启动 --- 很多网络服务程序是由inetd守护程序启动的
3)由cron定时启动的处理程序
4)由at启动的处理程序
5)终端启动---通常只用于守护进程的测试或者重启进程
6)终端上用nohup启动的进程 ---- 这种方法可以将所有程序变为守护进程