fork和vfork函数详解

fork

头文件:

#include //提供类型pid_t的定义

#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(退出进程) 之前与父进程数据是共享的)

参考文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。