fork函数 fork函数返回值
Unix标准的进程复制机制
在Unix系统中,进程复制通常通过fork(即分叉)系统调用实现,但Linux、BSD等操作系统并不仅限于这一种方式。实际上,Linux实现了三种进程复制方式:fork、vfork和clone。
在运行结果中,我们可以观察到父子两个进程的进程ID(PID)不同,但堆栈和数据资源是完全复制的。当子进程改变count的值时,父进程中的count值并不会受到影响。从内核的视角来看,子进程与父进程的count的虚拟地址是相同的,虽然在物理内存中它们的地址可能不同。
第一代Unix系统创建进程时,会原样复制父进程的整个地址空间并分配给子进程。这种做法非常耗时,因为它需要为子进程分配页表、页帧,并从父进程中复制页面到子进程中。
具体到vfork()和fork()的不同之处在于vfork()创建的子进程会共享父进程的物理和虚拟内存空间,并保持其数据段共享的状态更长时间。这种方式的目的是为了那些执行exec的子进程创建时不需要完整地拷贝父进程的资源。但是需要注意的是vfork()会导致父进程在子进程执行exec或exit之前被阻塞。
而clone()函数则提供了更大的灵活性,允许用户选择性地继承父进程的资源。它可以根据需要创建线程或独立的进程。