1.fork函数
头文件:
#include <sys/types.h>
#include <unistd.h>
函数原型:
pid_t fork(void);
函数参数:
无
函数功能:
创建子进程
返回值:
父进程:返回子进程的pid
子进程:返回0
错误:-1,并且使用perror查看错误信息
注意:
1.父子进程执行顺序不确定,统一由cpu调度
2.父进程从main函数开始执行,子进程从fork的下一条指令开始执行
3.父子进程有各自独立的地址空间,子进程会将父进程几乎所有的内容都拷贝一份
4.父进程先于子进程结束时,子进程就变成孤儿进程,同时在后台执行,子进程被init进程收养
子进程先于父进程结束时,父进程需要(wait/waitpid)回收子进程产生的资源;若没有回收进程相关资源,该子进程成为僵尸进程
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
pid_t pid = fork();
if(pid == -1)
{
perror("fork");
return -1;
}
if(pid == 0)//子进程
{
printf("Child process pid:%d My parent process pid:%d\n",getpid(),getppid());
exit(0);
}
else//pid>0//父进程
{
sleep(1);
printf("Parent pid:%d My parent process pid:%d\n",getpid(),getppid());
exit(0);
}
return 0;
}
运行结果:
2.vfork函数
头文件:
#include <sys/types.h>
#include <unistd.h>
函数原型:
pid_t vfork(void);
函数参数:
无
函数功能:
创建子进程
返回值:
父进程:返回子进程的pid
子进程:返回0
错误:-1,并且使用perror查看错误信息
3.fork和vfork函数的区别
1.vfork创建的子进程不会拷贝父进程地址空间 不复制数据
一般会用exec函数族(系列函数)来取代当前进程,以提高进程的效率
2.vfork函数一定会保证子进程先执行
3.vfork创建的子进程,如果没有用exec系列函数创建进程取代,需要exit系列函数来结束进程