1、fork函数
头文件:
#include <sys/types.h>
#include <unistd.h>
函数原型:
pid_t fork(void);
函数参数:
无
函数功能:
创建子进程
返回值:
父进程:返回子进程的pid
子进程:返回0
错误:-1,并且使用perror查看错误信息
2、vfork函数
头文件:
#include <sys/types.h>
#include <unistd.h>
函数原型:
pid_t vfork(void);
函数参数:
无
函数功能:
创建子进程
返回值:
父进程:返回子进程的pid
子进程:返回0
错误:-1,并且使用perror查看错误信息
3、区别
1、fork()是子进程复制了父进程的页表,但是不开辟空间,在没有修改或者使用新空间时,暂时与父进程共享空间;
vfork()是子进程复制了父进程指向页表的指针,达到完全共享的目的。双方使用同一个页表。
2、程序运行时fork()父子进程可以同步运行,vfork()保证子进程先运行,父进程要等待子进程使用exec去执行其它程序或者exit退出后才运行。
fork
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
pid_t pid = fork();
if(pid == -1)
{
perror("fork");
return -1;
}
else if(pid == 0)
{
printf("i am child process\n");
printf("my pid:%d\n",getpid());
}
else
{
printf("i am parent process\n");
printf("my pid:%d\n",getppid());
}
return 0;
}
vfork
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
pid_t pid = vfork();
if(pid == -1)
{
perror("vfork");
return -1;
}
else if(pid == 0)
{
printf("i am child process\n");
printf("my pid:%d\n",getpid());
exit(0);
}
else
{
printf("i am parent process\n");
printf("my pid:%d\n",getppid());
}
return 0;
}