#include <stdlib.h>
void exit(int status);
#include <unistd.h>
void _exit(int status);
exit函数与_exit函数一样,都是系统函数,且都是用来终止一个进程的,无论在程序中的什么位置,只要执行这exit或_exit系统调用,进程就会被终止。这两个函数都有一个整型形参,用于传递进程结束时的状态(正常结束还是意外结束)。一般,0表示正常结束,非0值(如1)表示出现了错误,非正常结束。可以利用wait系统调用接收子进程的返回值,从而针对不同的情况进行不同的处理。
exit与_exit是有区别的。首先,它们在函数库中的定义不同,头文件也不一样;另外,_exit会立即进入内核,而exit则会先执行一些清除处理(调用执行各终止处理程序,关闭所有所有标准I/O流、清除包括PCB在内的各种数据结构等),然后进入内核。
#include <unistd.h>
#include <sys/types.h>
pid_t vfork( void );
vfork也用于产生一个子进程,返回值与fork一样。其与fork的区别:fork创建的子进程要复制父进程的数据段(即各自独立);而vfork函数创建的子进程,在没有调用exec函数族或exit之前,会与父进程共享数据段(绝对共享,如果父进程引起数据段的改变也会体现在子进程中)。另外,fork不会对父子进程执行的次序进行限制,而vfork,子进程在调用exec函数族或exit之前,子进程先执行,父进程挂起,直到子进程调用了exec函数族或exit函数才会唤醒父进程,父子进程执行的次序才不会受到限制。
因此,vfork创建出来的并不是真正意义上的进程,而是线程,因为它缺少了进程的四要素之一:独立的内存资源。进程的四要素:1.要有一段程序供该进程运行;2.进程专用的系统堆栈空间;3.进程控制块;4.有独立的储存空间。