linux创建进程fork函数和vfork函数
#include <unistd.h>pid_t fork(void);#include <sys/types.h>#include <unistd.h>pid_t vfork(void);
返回:子进程中为0,父进程中为子进程ID,出错返回 -1
fork创建的新进程被称为子进程,该函数被调用一次但是返回两次,两次返回的区别是:在子进程中的返回值是,在父进程中的返回值是新的子进程的进程ID;
创建子进程,父进程哪个先运行根据系统的调度且复制父进程的内存空间。
vfork函数,创建子进程,但是子进程先运行且不复制父进程的内存空间。
fork函数示例:
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <errno.h>int glob = 6; /* external variable in initialized data */
char buf[] = "a write to stdout\n";int
main(void)
{int var; /* automatic variable on the stack */pid_t pid;var = 88;if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1)perror("write error");printf("before fork\n"); /* we don't flush stdout */if ((pid = fork()) < 0) {perror("fork error");} else if (pid == 0) { /* child */glob++; /* modify variables */var++;} else {sleep(2); /* parent */}printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);exit(0);
}
编译之后运行结果:
andrew@andrew-Thurley:~/work/apue.2e$ ./a.out
a write to stdout
before fork
pid = 16935, glob = 7, var = 89
pid = 16934, glob = 6, var = 88
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <errno.h>int glob = 6; /* external variable in initialized data */int
main(void)
{int var; /* automatic variable on the stack */pid_t pid;var = 88;printf("before vfork\n"); /* we don't flush stdio */if ((pid = vfork()) < 0) {perror("vfork error");} else if (pid == 0) { /* child */glob++; /* modify parent's variables */var++;_exit(0); /* child terminates */}/** Parent continues here.*/printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);exit(0);
}
编译之后运行结果:
andrew@andrew-Thurley:~/work/apue.2e$ ./a.out
before vfork
pid = 17047, glob = 7, var = 89
linux创建进程fork函数和vfork函数相关推荐
- linux中fork函数与vfork函数的区别
fork函数跟vfork函数一样能够创建进程,它们主要有两个区别 (1)区别一: vfork直接使用父进程存储空间,不拷贝. (2)区别二: vfork保证子进程先运行,当子进程调用exit退出后,父 ...
- fork()函数与vfork()函数的区别
1.fork()函数与vfork()函数 头文件: #include <sys/types.h> #include <unistd.h> 函数原型: pid_t fork(vo ...
- linux c之创建进程fork和vfork函数之间的区别
1.函数简介 1).得到当前的进程id pid_t getpid(); 2).fork函数 要创建进程,必须调用fork函数, 系统调用fork用于派生一个进程,函数原型如下 #include< ...
- 【Linux 内核】进程管理 ( 进程状态 | 进程创建 | 进程终止 | 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 )
文章目录 一.进程状态 二.进程创建 三.进程终止 ( 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 ) 一.进程状态 Linux 进 ...
- linux中fork()函数与vfork()函数的区别
对于fork函数: 子进程只继承父进程的文件描述表,不继承但共享文件表项和i-node 父进程创建一个子进程之后,文件表项中的引用计数加1变为2,当父进程作close操作之后计数器减1,子进程还是可以 ...
- Linux创建进程必须fork么,Linux - fork() 创建进程
Linux - fork() 创建进程 Linux - fork() 创建进程 介绍创建进程之前,先简单地介绍一下 Linux 下的进程内存布局. Stack - 所有函数的 local variab ...
- fork函数与vfork函数的区别
系统调用fork(),vfork()的区别: fork():无参数,资源全部复制,父进程所有的资源都全部通过数据结构的复制,传递给子进程. vfork():无参数,除了task_struct结构和系统 ...
- linux创建进程读共享写复制,Linux进程创建之fork浅析
在Linux 内核中,无时无刻不维护着进程,从进程的创建到进程销毁,每一个环境都有着复杂的细节.本篇介绍Linux 内核如何创建进程,深入理解 fork 函数以及子进程的创建,对理解多进程开发也至关重 ...
- 学习分享:fork函数与vfork函数的区别
一.fork函数 (一)fork函数头文件 #include <sys/types.h> #include <unistd.h> (二)fork函数原型 pid_ ...
最新文章
- π是无理数证明定积分_证明圆周率是无理数很容易?人类花了2000年!
- 当物联网实时工作时,城市才是“智能”的
- 电路设计中三极管和MOS管做开关用时的区别
- 转行数据分析师后悔了?脱颖而出才是关键!
- [渝粤教育] 西南科技大学 经济学概论 在线考试复习资料
- 【摘抄】其实我是间谍!
- 使用traceview进行Android性能测试(转)
- linux安装 wegt_linux 下安装wget
- html网页中获取vf数据到mysql_怎样从HTML网页中获取SQL数据库里的数据
- 课程设计题五:汽车尾灯控制器设计
- 数字电路:设计《三个开关控制一个灯的电路》
- 金山WPS c++ 二面面经
- 解锁三星bl锁有几种方法_三星S8有几种解锁方式?三星S8解锁方法介绍
- SAP中 关于BAPI_MATERIAL_SAVEDATA创建物料报错:字段MARA-MEINS/BAPI_MARA-BASE_UOM(_ISO)被定义为必需的字段; 它不包含条目
- codeforces 1520E. Arranging The Sheep(1400)
- ant-design-vue 1.7.8版本使用报错
- Java---登录页面及其接口的实现
- 判断门禁卡是否加密_离无卡生活更进一步!判断您的门禁卡能否被手机NFC功能模拟...
- Bat脚本实现定时演示PPT后自动关闭PPT
- matlab中功率谱密度,功率谱和功率谱密度