1.对进程的理解
进程是一段程序的一次执行过程。表面上看,可以理解为一个main函数执行了两次,但是细节是:父进程是完整的执行的,从开始到结束;而子进程是fork函数之前的部分没有执行,从fork()函数之后开始执行,一直到程序结束。
2.fork()函数
功能:产生一个子进程
函数原型:
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
在父进程中:成功返回子进程的PID,失败返回-1
在子进程中:成功返回0
在fork之前,对内存变量的所有操作将保存到fork()处,作为父进程和子进程的初始内存状态。
如果成功,则从fork位置,子进程和父进程的内存空间都是一样的(除了pid_t这个返回值),可以认为子进程的内存变量就是父进程的一份拷贝。但是从fork()之后,二者的内存空间就开始独立了,父进程中改变某个变量,对子进程将没有任何影响;同样,子进程改变某个变量,对父进程也不会有影响。如果想要二者交换数据,则需要使用进程间通信。
3.wait()函数
功能:父进程将自己挂起,等待子进程结束,再继续运行。
函数原型:
#include <sys/types.h>
#include <sys/wait.h>
pod_t wait(int *stat_loc);
stat_loc:状态信息
返回值:子进程PID
4.孤儿进程
一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
5.僵尸进程
一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,直至父进程结束,这种进程称之为僵尸进程。
时间范围:子进程结束后——父进程结束(在父进程结束后,僵死的子进程将成为僵死的孤儿进程,这时就可以有init进程领养,并释放了)
危害:占用进程号,占用资源。