打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Linux系统编程——vfork() 函数详解

所需头文件:

#include

#include

pid_t vfork(void);

功能:

vfork() 函数和 fork() 函数(fork()如何使用,请点此链接)一样都是在已有的进程中创建一个新的进程,但它们创建的子进程是有区别的。

参数:

返回值:

成功:子进程中返回 0,父进程中返回子进程 ID。pid_t,为无符号整型。

失败:返回 -1。

fork() 与 vfock() 都是创建一个进程,那它们有什么区别呢?

1)fork(): 父子进程的执行次序不确定。

vfork():保证子进程先运行,在它调用 exec(进程替换) 或 exit(退出进程)之后父进程才可能被调度运行。

2)fork(): 子进程拷贝父进程的地址空间,子进程是父进程的一个复制品。

vfork():子进程共享父进程的地址空间(准确来说,在调用 exec(进程替换) 或 exit(退出进程) 之前与父进程数据是共享的)



下面我们写一个例子来测试,通过 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;}

上面的代码,已经让子进程延时 3 s,结果还是子进程运行结束后,父进程才执行,运行结果如下:

接下来,我们一起验证,子进程共享父进程的地址空间:

#include #include #include int a = 10; int main(int argc, char *argv[]){ pid_t pid; int b = 20; pid = vfork(); // 创建进程 if(pid < 0){="" 出错="" perror('vfork');="" }="" if(0="=" pid){="" 子进程="" a="100," b="200;" printf('son:="" a="%d," b="%d\n'," a,="" b);="" _exit(0);="" 退出子进程,必须="" }else="" if(pid=""> 0){ // 父进程 printf('father: a = %d, b = %d\n', a, b); } return 0;}

通常运行结果得知,子进程修改 a, b 的值,会影响到父进程的 a, b, 效果图如下:

vfork() 保证子进程先运行,在它调用 exec(进程替换) 或 exit(退出进程)之后父进程才可能被调度运行。如果子进程没有调用 exec, exit, 程序则会导致死锁,程序是有问题的程序,没有意义,测试代码如下:

#include #include #include int main(int argc, char *argv[]){ pid_t pid; pid = vfork(); // 创建进程 if(pid < 0){="" 出错="" perror('vfork');="" }="" if(0="=" pid){="" 子进程="" printf('i="" am="" son\n');="" sleep(1);="" 子进程没有调用="" exec="" 或="" exit="" }else="" if(pid=""> 0){ // 父进程 printf('i am father\n'); sleep(1); } return 0;}

运行结果如下:

所以,用 vfork() 创建进程,子进程里一定要调用 exec(进程替换) 或 exit(退出进程),否则,程序会出问题,没有意义

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
fork与vfork的区别?
Linux fork与vfork的深入分析
fork与vfork的区别
linux fork函数与vfork函数
linux fork execv的使用
Linux进程学习总结 fork()和vfork()的学习
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服