1.vfork

vfork创建出的是线程,vfork的使用可以保证子进程先运行,在vfork出的子进程调用exit或exec函数后,父进程才能运行,在这之前,子进程与父进程共用地址空间以及代码等,在vfork中使用exit和return将会产生不同的结果:

fork、vfork与file struct_图片

fork、vfork与file struct_空间_02

上面是在子进程中执行exit的结果。

fork、vfork与file struct_图片_03

分析原因:

exit(0):正常运行程序并退出

exit(1):非正常运行导致退出

return ( ):如果在主函数main中,则会退出程序并返回一值,如果在其它函数中则会返回到调用函数处。

2.fork
fork()创建子进程,子进程与父进程是独立存在的。

i=0 时 2447-》2449
       2447-》2449-》2450
      
 i=1  2447-》2449
       2447-》2449-》2451
       
        2447-》2449-》2450
        2447-》2449-》2452
   理论上是这样,但图片上有的父进程的pid为1,是因为在i<2时,子进程还没有结束,而父进程已经结束了,故,父进程pid为1

fork、vfork与file struct_运行程序_04

fork、vfork与file struct_运行程序_05

3.file_struct
文件结构体代表一个打开的文件,系统中每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。在内核创建和驱动源码中,struct file的指针通常被命名为file或filp。