fork与vfork的区别与联系

fork()与vfock()都是创建一个进程,那他们有什么区别呢?总结有以下三点区别:
1. fork ():子进程拷贝父进程的数据段,代码段
vfork ( ):子进程与父进程共享数据段
2. fork ()父子进程的执行次序不确定
vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec
或exit 之后父进程才可能被调度运行。
3. vfork ()保证子进程先运行,在她调用exec 或exit 之后父进程才可能被调度运行。如果在
调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

时间: 2024-10-05 10:05:12

fork与vfork的区别与联系的相关文章

clone(),fork()与vfork()的区别

Linux提供三种方式复制子进程:fork(),clone(),vfork(). 区别: fork()函数复制时将父进程的所以资源都通过复制数据结构进行了复制,然后传递给子进程,所以fork()函数不带参数: clone()函数则是将部分父进程的资源的数据结构进行复制,复制哪些资源是可选择的,这个可以通过参数设定,所以clone()函数带参数,没有复制的资源可以通过指针共享给子进程.Clone()函数的声明如下: int clone(int(*fn)(void *), void *child_s

fork与vfork的区别

fork()与vfock()都是创建一个进程,那他们有什么区别呢?总结有以下三点区别: 1.  fork  ():子进程拷贝父进程的数据段,代码段     vfork ( ):子进程与父进程共享数据段 2.  fork ()父子进程的执行次序不确定     vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec     或exit 之后父进程才可能被调度运行. 3.  vfork ()保证子进程先运行,在她调用exec 或exit 之后父进程才可能被

fork和vfork程序验证区别

  1 #include<unistd.h>   2 #include<stdlib.h>   3 #include<stdio.h>   4 int _gvalue=100;   5 int main()   6 {   7     int _val=200;   8     pid_t id=fork();   9     if(id<0)  10     {  11         perror("fork");  12         

FILE、inode、fork和vfork

1.FILE文件指针 a>.指向进程用户区中的 FILE 结构的数据结构: b>.FILE 结构包括:I/O缓冲区.文件描述符(文件描述表的一个索引): c>.FILE 结构中含有文件描述符,可以使用 fopen 来获得文件指针,然后从文件指针获取文件描述符(文件描述符唯一,而文件指针不唯一,但指向的对象唯一): d>.FILE 结构函数可以看作是队 fd 直接操作的系统调用的封装,它的优点是带有I/O缓存,比 fd 具有跨平台性. 2.inode,软链接,硬链接 inode:记录

小程序分析(fork()和vfork())

分析下述程序,i<4时,最终创建了多少个进程. fork()是创建一个子进程. 分析:i=0时,父进程1创建了一个子进程1.(此时共2个进程) i=1时,父进程1继续创建子进程2,将子进程1又当成父进程,创建子进程3.(此时共6个进程) i=2时,将子进程当成父进程继续创建子进程.之前的父进程继续创建子进程.(此时共14个进程) i=3时,将子进程继续当成父进程继续创建子进程.之前的父进程继续创建子进程.(此时共30个进程) 注:可先计算由父进程创建的进程数,最后乘2即为总进程数. 扩展:当i<

fork与vfork

先看一个fork的例子: int glob = 4; int main(void) { int var, pid; var = 88; if ((pid = fork()) < 0) { printf("vfork error"); exit(-1); } else if (pid == 0) { /* 子进程 */ var++; glob++; exit(0); } printf("pid=%d, glob=%d, var=%d\n", getpid(),

Linux之fork与vfork区别

创建一个新进程的方法只有由某个已存在的进程调用fork()或vfork() 1.fork()函数 返回值:成功:父进程:返回子进程的PID 子进程:返回0 失败:父进程返回-1 子进程是父进程的一个拷贝.即子进程从父进程得到数据段和堆.栈段的拷贝,这些需要分配新的内存(不是与父进程共享,而是单独分配内存):而对于只读的代码段,通常使用共享内存的方式访问. fork返回后,子进程和父进程都从调用fork函数的下一条语句开始执行. 由于子进程与父进程的运行是无关的,所以,父进程可先于子进程运行,子进

fork与vfork的用法与区别

fork和vfork都用于创建进程 fork函数的作用是复制一个进程,当一个进程调用它,完成后就出现两个几乎一模一样的进程,也由此得到一个新的进程,称为子进程.原来的进程称为父进程.子进程是父进程的一个拷贝,即子进程从父进程得到了数据段和堆栈段的拷贝,这些需要分配新的内存:而对于只读的代码段,通常使用共享内存的方式访问. #include<stdio.h> #include<sys/types.h> #include<stdio.h> int main() {     

c语言exit和return区别,在fork和vfork中使用

c语言exit和return区别,在fork和vfork中使用 exit函数在头文件stdlib.h中. exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: return():返回函数,若在main主函数中,则会退出函数并返回一值,可以写为return(0),或return 0. 1. return返回函数值,是关键字:exit是一个函数. 2. return是语言级别的,它表示了调用堆栈的返回:而exit是系统调用级别的,它表示了一个进程的结束. 3. retu