Linux 服务器编程
  • Introduction
  • First Chapter
  • 文件I/O
    • 基于文件描述符的I/O操作
      • Linux 文件系统
      • 常用文件操作函数
    • 基于流的I/O操作
  • I/O模型
    • 概念理解
    • 对比五种I/O模型
    • select、poll、epoll简介
  • TCP / IP
    • OSI七层协议模型与TCP/IP四层模型
  • Socket
    • 基础
      • 什么是socket?
      • IPV4 套接口地址结构
      • 网络字节序
      • 字节序转换函数与地址转换函数
    • TCP客户端/服务器模型
    • Socket 相关函数
      • 使用socket()函数创建套接字
      • 使用bind()和connect()函数
      • 使用listen()和accept()函数
      • 使用read()和write()函数
    • 回射客户端/客户端的实现
    • 附录*资料
  • 附录*Linux常见信号
  • 多进程编程
    • 共享内存
    • fork函数
    • fork与vfork的区别
  • 附录*资料
  • 五种I/O模型
Powered by GitBook
On this page

Was this helpful?

  1. 多进程编程

fork与vfork的区别

1.vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

2.fork要拷贝父进程的进程环境;而vfork则不需要完全拷贝父进程的进程环境,在子进程没有调用exec和exit之前,子进程与父进程共享进程环境,相当于线程的概念,此时父进程阻塞等待。

为什么会有vfork呢?

因为以前的fork当它创建一个子进程时,将会创建一个新的地址空间,并且拷贝父进程的资源,然后将会有两种行为:

1.执行从父进程那里拷贝过来的代码段

2.调用一个exec执行一个新的代码段

当进程调用exec函数时,一个新程序替换了当前进程的正文,数据,堆和栈段。这样,前面的拷贝工作就是白费力气了,这种情况下,聪明的人就想出了vfork。vfork并不复制父进程的进程环境,子进程在父进程的地址空间中运行,所以子进程不能进行写操作,并且在儿子“霸占”着老子的房子时候,要委屈老子一下了,让他在外面歇着(阻塞),一旦儿子执行了exec或者exit后,相当于儿子买了自己的房子了,这时候就相当于分家了。

因此,如果创建子进程是为了调用exec执行一个新的程序的时候,就应该使用vfork

Previousfork函数Next附录*资料

Last updated 5 years ago

Was this helpful?