1.系统调用fork()允许一个进程(父进程)创建一新进程(子进程)。具体做法是:新的子进程几乎是父进程的翻版,子进程获得了父进程的栈、数据段、堆和执行文本段的拷贝。可视作将父进程一分为二,术语fork由此得名。(fork()无需参数)
2.库函数exit(status)终止一个进程,将进程占用的所有资源(内存,文件描述符等)归还给内核,交其进行再次分配。参数status为一盒整形变量,标识进程的退出状态。父进程可使用系统调用wait()来获取该状态。
3.库函数exit()位于系统调用_exit()之上。在调用fork()之后,父子进程中一般只有一个会通过exit()退出,另一个进程则应使用_exit()终止。
4.系统调用wait(&status)的目的有两个:
- 如果子进程未调用exit()终止,那么wait()会挂起父进程直至子进程终止。(父进程挂起等子进程终止)
- 子进程的终止状态通过wait()的status参数返回。(父进程可直接获取子进程的终止状态)
ps:
挂起:一般是主动的,由系统或程序发出,甚至于辅存中去。(不释放CPU,可能释放内存,放在外存)
阻塞:一般是被动的,在抢占资源中得不到资源,被动的挂起在内存,等待某种资源或信号量(即有了资源)将他唤醒。(释放CPU,不释放内存)
5.系统调用execve(pathname, argv, envp)加载一个新程序(路径名为pathname,参数列表为argv,环境变量列表为exvp)到当前进程的内存。这将丢弃现存的程序文本段,并为程序重新创建栈、数据段以及堆。(fork()出一个子进程后,在调用execve()修改子进程使其和父进程不同)