第八章 进程控制
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来实现
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来实现
相关文章推荐
- AUPE学习第八章------进程控制
- UNIX环境高级编程——第八章—进程控制
- 第八章 进程控制
- 第八章 进程控制 exec函数
- APUE第八章 进程控制
- 第八章(一) 进程控制
- [APUE]第八章 进程控制
- 第八章 进程控制 fork函数
- APUE第八章 进程控制
- APUE学习笔记:第八章 进程控制
- [APUE]第八章 进程控制
- APUE学习笔记——第八章 进程控制
- apue第八章 进程控制(2)
- UNIX环境高级编程--第八章进程控制总结
- [APUE]第八章 进程控制
- 第八章 进程控制 waitpid函数
- apue第八章 进程控制(3) exec函数族
- 《Unix高级环境编程》第八章 进程控制
- 《APUE》笔记-第八章-进程控制
- 《APUE》读书笔记—第八章进程控制