fork函数:
功能:创建子进程
fork的奇妙之处在于它被调用一次,却返回两次,它可能有三种不同的返回值:
1、在父进程中,fork返回新创建的子进程的PID;
2、在子进程中,fork返回0;
3、如果出现错误,fork返回一个负值
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("main pid: %d\n",getpid());
pid_t pid = fork();
if(-1 == pid)
{
perror("fork");
return 1;
}
if(0 == pid)
{
printf("Child Process : ");
printf("pid = %d,ppid = %d\n",getpid(),getppid());
}
else if(pid > 0)
{
printf("Parent Process : ");
printf("childpid = %d,pid = %d\n",pid,getpid());
}
return 0;
}
执行结果如下:
父进程的pid等于子进程的pid加1.
vfork函数:
vfork函数创建的新进程,刚开始时会暂时与父进程共享地址空间。另外,vfork函数保证子进程先运行,在它调用exit之后(关键)父进程才可能被调度运行。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int a = 10;
pid_t pid = vfork();
int b = 10;
if(-1 == pid)
{
perror("vfork");
exit(1);
}
if(0 == pid)
{
sleep(2);
a++;
b++;
printf("this is child : a = %d,b = %d\n",a,b);
exit(2);
}
else if(pid > 0)
{
printf("this is parent : a = %d,b = %d\n",a,b);
}
return 0;
}
执行结果如下:
在vfork()前后声明的变量,运行结果有何不同?真正共享的是之前的还是之后的?
在vfork()前声明的变量会被子进程改变,在vfork()后声明的变量不会被子进程改变,所以真正共享的是之前的。
此外,我在代码的子进程中加了一个2秒的延迟,事实证明调用vfork函数,先执行的一定是子进程。
fork函数与vfork函数的区别:
1. fork:子进程拷贝父进程的数据段
vfork:子进程与父进程共享数据段
2. fork:父、子进程的执行次序不确定
vfork:子进程先运行,父进程后运行