Linux系统编程——vfork() 函数详解
所需头文件:
#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() 创建的子进程会执行完后,才到父进程执行:
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- int main(int argc, char *argv[])
- {
- pid_t pid;
- pid = vfork(); // 创建进程
- if(pid < 0){ // 出错
- perror("vfork");
- }
- if(0 == pid){ // 子进程
- sleep(3); // 延时 3 秒
- printf("i am son\n");
- _exit(0); // 退出子进程,必须
- }else if(pid > 0){ // 父进程
- printf("i am father\n");
- }
- return 0;
- }
上面的代码,已经让子进程延时 3 s, 结果还是子进程运行结束后,父进程才执行 ,运行结果如下:
验证:子进程共享父进程的地址空间
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- int a = 10;
- int main(int argc, char *argv[])
- {
- pid_t pid;
- int b = 20;
- pid = vfork(); // 创建进程
- if(pid < 0){ // 出错
- perror("vfork");
- }
- if(0 == pid){ // 子进程
- a = 100, b = 200;
- printf("son: a = %d, b = %d\n", a, b);
- _exit(0); // 退出子进程,必须
- }else if(pid > 0){ // 父进程
- printf("father: a = %d, b = %d\n", a, b);
- }
- return 0;
- }
通常运行结果得知,子进程修改 a, b 的值,会影响到父进程的 a, b, 效果图如下:
vfork() 保证子进程先运行,在它调用 exec(进程替换) 或 exit(退出进程)之后父进程才可能被调度运行。如果子进程没有调用 exec, exit, 程序则会导致死锁,程序是有问题的程序,没有意义,测试代码如下:
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- int main(int argc, char *argv[])
- {
- pid_t pid;
- pid = vfork(); // 创建进程
- if(pid < 0){ // 出错
- perror("vfork");
- }
- if(0 == pid){ // 子进程
- printf("i am son\n");
- sleep(1);
- // 子进程没有调用 exec 或 exit
- }else if(pid > 0){ // 父进程
- printf("i am father\n");
- sleep(1);
- }
- return 0;
- }
运行结果如下:
所以,用 vfork() 创建进程,子进程里一定要调用 exec(进程替换) 或 exit(退出进程),否则,程序会出问题,没有意义。
源码下载:http://download.csdn.net/download/lianghe_work/8835747
转自:http://blog.csdn.net/tennysonsky/article/details/45847107
Linux系统编程——vfork() 函数详解相关推荐
- linux网络编程常用函数详解与实例(socket--bind--listen--accept)
常用的网络命令: netstat 命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的选项我们常用的选项是 -an 用来显示详细的网络状态.至于其它的选项我们可 ...
- Linux 系统 文件锁 fcntl函数详解
#include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int ...
- Linux文件编程常用函数详解——lseek()函数
lseek()函数的头文件和形式: #include <sys/types.h> #include <unistd.h> off_t lseek(int filedes, of ...
- linux socket编程 accept函数详解
int accept(int sockfd,struct sockaddr * addr,socklen_t * addrlen); sockfd的参数为listen()函数返回的监听套接字: add ...
- 【Linux系统编程】vfork() 函数详解
00. 目录 文章目录 00. 目录 01. vfork函数 02. fork和vfork区别 03. 父子进程地址空间 04. 附录 01. vfork函数 函数分析 #include <sy ...
- linux send与recv函数详解
linux send与recv函数详解 1 #include <sys/socket.h> 2 ssize_t recv(int sockfd, void *buff, size_t nb ...
- Linux系统UID和GID详解
Linux系统UID和GID详解 <script src="http://hot.tianyaclub.com/hot.js"></script> 一个文件 ...
- linux系统下grub.cfg详解和实例操作
linux系统下grub.cfg详解和实例操作 简介 grub是引导操作系统的程序,它会根据自己的配置文件,去引导内核,当内核被加载到内存以后,内核会根据grub配置文件中的配置,找到根分区所使用的文 ...
- linux中recvfrom读取速度,Linux系统调用-- recv/recvfrom 函数详解
Linux系统调用-- recv/recvfrom函数详解 功能描述: 从套接字上接收一个消息.对于recvfrom,可同时应用于面向连接的和无连接的套接字.recv一般只用在面向连接的套接字,几乎等 ...
- u盘制作大师 linux系统教程,制作用U盘启动的Linux系统的简单步骤详解
制作用U盘启动的Linux系统的简单步骤详解 最近听朋友说误删除了Linux系统里的文件,于是系统进不了,里面保存着很多重要的数据,这该怎么办?虽然可以把硬盘取出挂载其他Linux系统运行,也可跳过控 ...
最新文章
- java classpath 和 jar 简介
- SAP FICO hande汉得培训资料---II 应收模块篇 PDF 电子版
- asp.net三层架构连接Oracle 11g详解
- cat /proc/maps 进程内存映射【转】
- C# ref与out关键字解析
- 最后期限 软件工程_如何在软件开发的最后期限内实现和平
- c语言从html控件sscanf,sscanf与sprintf在C语言中的用法
- git安装-centos版
- 解决重启VCSA 6.0,访问vsphere web client提示:503 Service Unavailable错误
- java 链表算法_数据结构算法Java版(一) 链表
- mysql中添加中文存储和显示功能
- STM32F103 mbed输出互补pwm
- 实习成长之路——SpringBean一:BeanDefinition元信息有什么?除了Bean名称和类型,还有那些Bean的元信息值得关注?
- cmor在matlab中,MATLAB小波变换指令及其功能介绍(超级有用)(最新整理)
- AD Migration Project
- 工信部专项认证有什么用?
- 新手小白学吉他,如何掌握基础快速入门
- PYNQ系列学习(三)|pynq与zynq对比(二)
- GD32F4xx控制DGUS触控按键
- 人大金仓KingbaseES大小写敏感性专题
热门文章
- Android AlertDialog 实现对话框 警告对话框、列表对话框、自定义对话框
- RK3288_Android7.1调试uart串口屏
- Xamarin 打包生成 Android apk 文件
- 15-struct(构造函数,重载)
- Codeforces Round #215 (Div. 2) B. Sereja and Suffixes map
- 显示器驱动程序已停止响应 并且已成功恢复
- 一个JavaScript的小问题
- 关于Adobe AIR 获取屏幕信息及任务栏高度.
- 双点双向路由引入/路由重发布
- web安全day18:kali下的两个实验彻底理解中间人攻击