欢迎光临散文网 会员登陆 & 注册

Linux--进程(vfork)

2023-03-17 23:19 作者:圣母和正负喜欢没办法  | 我要投稿

一、概述

vfork()函数:

不创建父进程的副本,相反父子进程共享数据,CW技术不适用。

和fork()异同点:

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

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

能被调度运行。

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

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

进程) 之前与父进程数据是共享的)。

共享进程空间

例程1:子先父后

#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(10);

printf("child\n");

_exit(0); 

}else if(pid > 0){ 

printf("parent\n");

}

return 0;

}

执行:gcc  Tvfork.c  -o Tvfork -Wall

          ./Tvfork

child

parent

上诉先输出子进程在输出父进程

例程2:共享

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

int data = 10;

int main(int argc, char *argv[])

{

pid_t pid;

int sum = 20;

pid = vfork();

if(pid < 0){ 

perror("vfork");

}

if(0 == pid){ 

data = 100, sum = 200;

printf("child: data = %d, sum = %d\n", data, sum);

_exit(0);

}else if(pid > 0){ 

printf("father: data = %d, sum = %d\n", data, sum);

}

return 0;

}

输出结果是一样的。

例程3:子先,调用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("child\n");

sleep(1);

}else if(pid > 0){ 

printf("parent\n");

sleep(1);

}

return 0;

}

没有调用exec、exit会无限循环

具体见man手册


Linux--进程(vfork)的评论 (共 条)

分享到微博请遵守国家法律