所需头文件:

#include <sys/types.h>

#include <unistd.h>

pid_t vfork(void);

功能:

vfork() 函数和 fork() 函数(fork()如何使用,请点此链接)一样都是在已有的进程中创建一个新的进程,但它们创建的子进程是有区别的。

参数:

返回值:

成功:子进程中返回 0,父进程中返回子进程 ID。pid_t,为无符号整型。

失败:返回 -1。

fork() 与 vfock() 都是创建一个进程,那它们有什么区别呢?

1)fork(): 父子进程的执行次序不确定。

vfork():保证子进程先运行,在它调用 exec(进程替换) 或 exit(退出进程)之后父进程才可能被调度运行。

2)fork(): 子进程拷贝父进程的地址空间,子进程是父进程的一个复制品。

vfork():子进程共享父进程的地址空间(准确来说,在调用 exec(进程替换) 或 exit(退出进程) 之前与父进程数据是共享的)

验证:通过 vfork() 创建的子进程会执行完后,才到父进程执行:

[csharp] view plaincopy
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. int main(int argc, char *argv[])
  5. {
  6. pid_t pid;
  7. pid = vfork();  // 创建进程
  8. if(pid < 0){ // 出错
  9. perror("vfork");
  10. }
  11. if(0 == pid){ // 子进程
  12. sleep(3); // 延时 3 秒
  13. printf("i am son\n");
  14. _exit(0); // 退出子进程,必须
  15. }else if(pid > 0){ // 父进程
  16. printf("i am father\n");
  17. }
  18. return 0;
  19. }

上面的代码,已经让子进程延时 3 s, 结果还是子进程运行结束后,父进程才执行 ,运行结果如下:

验证:子进程共享父进程的地址空间

[csharp] view plaincopy
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. int a = 10;
  5. int main(int argc, char *argv[])
  6. {
  7. pid_t pid;
  8. int b = 20;
  9. pid = vfork();  // 创建进程
  10. if(pid < 0){ // 出错
  11. perror("vfork");
  12. }
  13. if(0 == pid){ // 子进程
  14. a = 100, b = 200;
  15. printf("son: a = %d, b = %d\n", a, b);
  16. _exit(0); // 退出子进程,必须
  17. }else if(pid > 0){ // 父进程
  18. printf("father: a = %d, b = %d\n", a, b);
  19. }
  20. return 0;
  21. }

通常运行结果得知,子进程修改 a, b 的值,会影响到父进程的 a, b, 效果图如下:

vfork() 保证子进程先运行,在它调用 exec(进程替换) 或 exit(退出进程)之后父进程才可能被调度运行。如果子进程没有调用 exec, exit, 程序则会导致死锁,程序是有问题的程序,没有意义,测试代码如下:

[csharp] view plaincopy
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. int main(int argc, char *argv[])
  5. {
  6. pid_t pid;
  7. pid = vfork();  // 创建进程
  8. if(pid < 0){ // 出错
  9. perror("vfork");
  10. }
  11. if(0 == pid){ // 子进程
  12. printf("i am son\n");
  13. sleep(1);
  14. // 子进程没有调用 exec 或 exit
  15. }else if(pid > 0){ // 父进程
  16. printf("i am father\n");
  17. sleep(1);
  18. }
  19. return 0;
  20. }

运行结果如下:

所以,用 vfork() 创建进程,子进程里一定要调用 exec(进程替换) 或 exit(退出进程),否则,程序会出问题,没有意义。

源码下载:http://download.csdn.net/download/lianghe_work/8835747

转自:http://blog.csdn.net/tennysonsky/article/details/45847107

Linux系统编程——vfork() 函数详解相关推荐

  1. linux网络编程常用函数详解与实例(socket--bind--listen--accept)

    常用的网络命令: netstat 命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的选项我们常用的选项是 -an 用来显示详细的网络状态.至于其它的选项我们可 ...

  2. Linux 系统 文件锁 fcntl函数详解

    #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int ...

  3. Linux文件编程常用函数详解——lseek()函数

    lseek()函数的头文件和形式: #include <sys/types.h> #include <unistd.h> off_t lseek(int filedes, of ...

  4. linux socket编程 accept函数详解

    int accept(int sockfd,struct sockaddr * addr,socklen_t * addrlen); sockfd的参数为listen()函数返回的监听套接字: add ...

  5. 【Linux系统编程】vfork() 函数详解

    00. 目录 文章目录 00. 目录 01. vfork函数 02. fork和vfork区别 03. 父子进程地址空间 04. 附录 01. vfork函数 函数分析 #include <sy ...

  6. linux send与recv函数详解

    linux send与recv函数详解 1 #include <sys/socket.h> 2 ssize_t recv(int sockfd, void *buff, size_t nb ...

  7. Linux系统UID和GID详解

    Linux系统UID和GID详解 <script src="http://hot.tianyaclub.com/hot.js"></script> 一个文件 ...

  8. linux系统下grub.cfg详解和实例操作

    linux系统下grub.cfg详解和实例操作 简介 grub是引导操作系统的程序,它会根据自己的配置文件,去引导内核,当内核被加载到内存以后,内核会根据grub配置文件中的配置,找到根分区所使用的文 ...

  9. linux中recvfrom读取速度,Linux系统调用-- recv/recvfrom 函数详解

    Linux系统调用-- recv/recvfrom函数详解 功能描述: 从套接字上接收一个消息.对于recvfrom,可同时应用于面向连接的和无连接的套接字.recv一般只用在面向连接的套接字,几乎等 ...

  10. u盘制作大师 linux系统教程,制作用U盘启动的Linux系统的简单步骤详解

    制作用U盘启动的Linux系统的简单步骤详解 最近听朋友说误删除了Linux系统里的文件,于是系统进不了,里面保存着很多重要的数据,这该怎么办?虽然可以把硬盘取出挂载其他Linux系统运行,也可跳过控 ...

最新文章

  1. java classpath 和 jar 简介
  2. SAP FICO hande汉得培训资料---II 应收模块篇 PDF 电子版
  3. asp.net三层架构连接Oracle 11g详解
  4. cat /proc/maps 进程内存映射【转】
  5. C# ref与out关键字解析
  6. 最后期限 软件工程_如何在软件开发的最后期限内实现和平
  7. c语言从html控件sscanf,sscanf与sprintf在C语言中的用法
  8. git安装-centos版
  9. 解决重启VCSA 6.0,访问vsphere web client提示:503 Service Unavailable错误
  10. java 链表算法_数据结构算法Java版(一) 链表
  11. mysql中添加中文存储和显示功能
  12. STM32F103 mbed输出互补pwm
  13. 实习成长之路——SpringBean一:BeanDefinition元信息有什么?除了Bean名称和类型,还有那些Bean的元信息值得关注?
  14. cmor在matlab中,MATLAB小波变换指令及其功能介绍(超级有用)(最新整理)
  15. AD Migration Project
  16. 工信部专项认证有什么用?
  17. 新手小白学吉他,如何掌握基础快速入门
  18. PYNQ系列学习(三)|pynq与zynq对比(二)
  19. GD32F4xx控制DGUS触控按键
  20. 人大金仓KingbaseES大小写敏感性专题

热门文章

  1. Android AlertDialog 实现对话框 警告对话框、列表对话框、自定义对话框
  2. RK3288_Android7.1调试uart串口屏
  3. Xamarin 打包生成 Android apk 文件
  4. 15-struct(构造函数,重载)
  5. Codeforces Round #215 (Div. 2) B. Sereja and Suffixes map
  6. 显示器驱动程序已停止响应 并且已成功恢复
  7. 一个JavaScript的小问题
  8. 关于Adobe AIR 获取屏幕信息及任务栏高度.
  9. 双点双向路由引入/路由重发布
  10. web安全day18:kali下的两个实验彻底理解中间人攻击