您的位置:首页 > 其它

第八章 进程控制

2009-09-01 16:10 274 查看
1. 进程标示符PID

ID为0的进程通常是调度进程,常常被成为交换进程(swapper), 作为内核的一部分,它不执行任何磁盘的程序,因此也被成为系统进程

ID为1 的通常是 init 进程。 在自举过程中被内核调用。该进程的程序文件时 /sbin/init。 此进程负责在自举内核后启动一个UNIX系统。 读与系统相关的初始化文件(/etc/rc* 或 /etc/inittab 以及/etc/init.d中的文件),并引导系统到一个状态(如多用户)。init绝不会终止,它是一个普通的用户进程(区别于内核进程),但它以超级用户特权运行。如果父进程在子进程终止之前就结束了,则该父进程的所有子进程(孤儿进程)的父进程ID(PPDI)都会被设成 1。

2. fork函数

#include <unistd.h>

pid_t fork(void)

由fork创建的新进程被成为子进程(child process)。 fork函数被调用一次,但返回两次。两次分会的唯一区别是子进程的返回值是0. 而父进程的返回值则是新子进程的进程ID。

文件共享

由于fork函数复制了父进程的文件打开表给子进程,故具有父子关系的进程将共享打开文件。P175

vfork函数

vfork和fork的功能基本一致,均是创建创建一个新进程。但是有两点不同:

a) vfork创建的新进程专门用于执行新的程序,所以它不会全部复制父进程地址空间内的所有信息给子进程。通常调用vfork后,子进程将紧跟着调用exec

b) vfork保证子进程首先运行,父进程挂起,直至子进程调用exec或exit,父进程才重新运行

4。wait 和 waitpid函数

当一个进程结束的时候,内核将发送一个SIGCHLD信号给其父进程。下面两个函数用于父进程等待子进程结束

pid_t wait(int *statloc);

pid_t waitpid(pid_t pid, int *statloc, int options);

both return process ID if OK, 0 and -1 on error

参数说明:

int *statloc用于存储结束进程的终止状态。但如果我们不关心子进程的结束状态,可以给null指针。

pid_t pid : waitpid指定等待进程的ID号。

若指定pid=-1,则其功能与wait一致,相当于无阻塞版的wait

两者区别:

wait将阻塞调用进程,直至该进程任何一个子进程结束。但如果该进程有僵尸子进程,则wait函数将立即返回,statloc存放该僵尸进程的终止状态。

(僵尸进程,zombie process,指已经结束的进程,但其父进程并未获取其终止状态,释放资源等操作的进程)

waitpid等待process id为pid的子进程结束。即利用该函数可以扑获指定的进程结束的状态,但是并不阻塞调用者

5。exec函数

前面提到vfork,创建的子进程用于执行新的程序,共有六种形式的exec P188

记忆方法:

l : 表示使用参数列表(list)

e:表示使用新的环境变量,不从当前继承

p: 表示使用文件名,并从PATH环境进行搜索

6. System函数

利用System函数可以在程序中方便的调用shell命令.

例如,想向一个文件中保存当前时间,可以很容易实现 System("date > file");

System函数原形为 :

int system(const char *cmdstring);

system函数由fork,exec,waitpid来实现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: