fork和vfork函数详解
fork
头文件:
#include
#include
函数原型:
pid_t fork(void);
函数参数:
无
函数功能:
创建子进程
返回值:
父进程:返回子进程的pid(大于0的整数)
子进程:返回0
错误:-1,并且使用perror查看错误信息
注意:
1.父子进程执行顺序不确定,统一由cpu调度
2.父进程从main函数开始执行,子进程从fork的下一条指令开始执行
3.父子进程有各自独立的地址空间,子进程会将父进程几乎所有的内容都拷贝一份;
4.父进程先于子进程结束时,子进程就变成孤儿进程,同时在后台执行,子进程被init进程收养
子进程先于父进程结束时,父进程需要(wait/waitpid)回收子进程产生的资源
fork函数实例
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
pid_t pid = fork();
if(pid == -1)
{
perror("fork");
return -1;
}
if(pid == 0)//子进程
{
printf("Child pid:%d My parent pid:%d\n",getpid(),getppid());
exit(0);//进程退出函数
}
else//父进程
{
//sleep(1);//延时1秒
wait(NULL);//阻塞等待任意子进程结束并回收进程产生的资源 同时接受exit/_exit的退出状态值
printf("parent pid:%d My parent pid:%d\n",getpid(),getppid());
exit(0);
}
return 0;
}
vfork
头文件:
#include
#include
函数原型:
pid_t vfork(void);
函数功能:
vfork()函数和fork()函数一样都是在已有的进程中创建一个新的进程,但它们创建的子进程是有区别的。
函数参数:
无
返回值:
子进程:返回 0
父进程:返回子进程的ID
失败:返回 -1
vfork函数实例
#include
#include
#include
int main(int argc, char *argv[])
{
pid_t pid;
pid = vfork(); // 创建进程
if(pid < 0){ // 出错
perror("vfork");
}
if(0 == pid){ // 子进程
sleep(3); // 延时 3 秒
printf("i am son\n");
_exit(0); // 退出子进程,必须
}else if(pid > 0){ // 父进程
printf("i am father\n");
}
return 0;
}
fork和vfork函数区别
1)fork(): 父子进程的执行次序不确定。
vfork():保证子进程先运行,在它调用 exec(进程替换) 或 exit(退出进程)之后父进程才可能被调度运行。
2)fork(): 子进程拷贝父进程的地址空间,子进程是父进程的一个复制品。
vfork():子进程共享父进程的地址空间(准确来说,在调用 exec(进程替换) 或 exit(退出进程) 之前与父进程数据是共享的)
参考文章
发表评论