1、fork()函数与vfork()函数
头文件:
#include <sys/types.h>
#include <unistd.h>
函数原型:
pid_t fork(void)
函数参数:
无
函数功能:
创建一个子进程
函数返回值:
fork()与vfork()调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;
用fork()函数创建进程
//用fork创建进程
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
int count = 0;
pid_t pid = fork(); //调用fork函数创建进程
if(pid == -1){ //创建失败
perror("fork error");
return -1;
}
else if(pid == 0){ //子进程
printf("I am child pid:%d count = %d\n",getpid(),count++);
}
else{ //父进程
printf("I am parent pid:%d count = %d\n",getpid(),count++);
usleep(200);
}
return 0;
}
用vfork()创建进程
//用vfork创建进程
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
int count = 0;
pid_t pid = vfork(); //调用fork函数创建进程
if(pid == -1){ //创建失败
perror("fork error");
return -1;
}
else if(pid == 0){ //子进程
printf("I am child pid:%d count = %d\n",getpid(),count++);
}
else{ //父进程
printf("I am parent pid:%d count = %d\n",getpid(),count++);
usleep(200);
}
return 0;
}
2、两者的区别:
1.fork()函数创建的子进程是独立地空间,并且把父进程的代码段和数据段拷贝到子进程
而vfork()创建的子进程与父进程共享数据段。
2.用fork()创建的进程,父子进程的执行顺序是不确定的,由系统调度。但是用vfork()创建进程,会保证子进程优先运行,只有在子进程调用exec或exit之后,才可能调度父进程运行。