进程之 fork 与 vfork 使用
编写程序实现以下功能:
- 在父进程中定义变量n,在子进程中对变量n进行++操作;并且打印变量n的值,打印子进程pid;
- 在父进程中打印变量n的值,并且打印父进程pid。
- 要求分别用fork和vfork创建子进程。
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
int main()
{
int n=1;
pid_t pid=fork(); //使用fork 创建子进程,得到一个返回值(pid),通过这个返回值可以判断一个进程是 子进程 还是 父进程
if(pid == 0) //pid 为0 时,是子进程
{
n++;
printf("fork出的子进程中n=%d\n",n); //打印子进程中 n++的结果
exit(0);
}
else{
sleep(1);
printf("父进程中n=%d\n",n); //打印父进程中 n的结果
printf("fork出的子进程为pid:%d\n",pid);//这个返回值(pid)在父进程中返回的是 子进程的 ID
printf("父进程的pid:%d\n",getpid()); //打印父进程的 ID
pid_t pid1=vfork();//使用 vfork 创建子进程,得到一个返回值( pid1 )
if(pid1 == 0) //pid 为0 时,是子进程
{
sleep(2);
n++;
printf("vfork 出的子进程中n=%d\n",n); //打印子进程中 n++的结果
exit(0);
}
else {
printf("父进程中n=%d\n",n); //打印父进程中 n的结果
printf("pid1:%d\n",pid1);
printf("父进程的pid:%d\n",getpid());
}
}
return 0;
}
/*
- fork出来的子进程打印的 n 于 父进程打印的 n 的值一样吗?
不一样 ,因为fork创建的子进程是完全复制父进程的资源,之后独立于父进程之外 - vfork出来的子进程打印的 n 于 父进程打印的 n 的值一样吗?
一样 ,vfork函数并不将父进程的地址空间完全复制到子进程中。而是与父进程共享资源 - vfork 于 fork 区别 ?
回答就是前两个问题的答案
*/