fork函数和vfork函数 road与fork函数和vfork函数ed road区别

vfork函数和vfork函数可以用来创建一个新進程与fork函数和vfork函数相比,也有独特的用处

1.1 vfork函数和vfork函数与fork函数和vfork函数一样都是调用一次返回两次

2.2 fork函数和vfork函数创建子进程时,是完全复制父进程的资源这样的子进程独立与父进程。

vfork函数和vfork函数创建时操作系统并不将父进程的地址空间完全复制到子进程而是共享父进程的哋址空间,子进程对该地址空间的任何数据的修改父进程可见

3.3fork函数和vfork函数创建一个子进程时,那个进程先运用取决于系统的调度算法②vfork函数和vfork函数一个进程时,必须先确保子进程先运行

当它调用exec或者说exit后父进程才能被调度运行。

当它调用exec或者说exit之前子进程要依赖父进程的某个行为就会导致死锁。

在Linux编程中我们经常使用 fork函数和vfork函数()。然而不少情况下fork函数和vfork函数是有危险的。但是又不能简单使用vfork函数和vfork函数替换就成了这个笔记说明了两者使用的一些注意点。

函数vfork函数和vfork函数的作用是创建一个子进程而这个子进程的作用是用于调用exec(),从而再执行一个新进程(往往是用来执行其它的程序)

在程序的执行效果上fork函数和vfork函数会将父进程的地址空间复制一份,但是vfork函数和vfork函数并不是这么做,而是vfork函数和vfork函数 之后的子进程在调用 exec 戓 exit 之前,在父进程的空间中执行

vfork函数和vfork函数保证子进程优先执行到execexit之前,父进程都不会被调度
fork函数和vfork函数父子进程执行顺序不确定。

因此执行了vfork函数和vfork函数之后,子进程请立即执行 exec而不要再执行一次 fork函数和vfork函数,否则就可能导致死锁
或者这么说,如果在execexit之前依赖于父进程的进一步动作就会导致死锁

另外请留意,exec并不是创建进程只是用新程序替换了当前进程的上下文。

频繁调用system()之后有可能卡死不返回,就是因为出现了这个情况system是基于fork函数和vfork函数实现的,调用后父子进程调用顺序不一定可能导致system()调用死锁。
这个危险的函数现在我们已经禁用了。换成使用vfork函数和vfork函数或者是__libc_fork函数和vfork函数实现代码如下(这份是我自己写的,不是公司的代码不过原理上差不多):

_close_all_fds(); /* 这是我自己写的一个函数,用来关闭所有继承的文件描述符可不用 */

使用时用AMCSystemCmd()直接替代system即可,还支持动态参数列表呢

原文中没囿_close_all_fds 的代码这里添加我的实现。

fork函数和vfork函数和vfork函数和vfork函数()函数都鈳以创建一个新的进程主要的两个区别如下:

1.vfork函数和vfork函数()函数在创建子进程时,不会复制父进程的所有资源相反,子进程共享父进程嘚内存

2.vfork函数和vfork函数()函数创建的子进程最后必须调用_exit()函数才能正确退出子进程,不能使用exit()函数

为了更便于理解fork函数和vfork函数()和vfork函数和vfork函数()兩个函数创建的子进程的区别,可以使用如下两个测试程序来分别运行看一下:



 _exit(0);创建的子进程必须调用_exit()函数才能正确退出

如上所示的两組程序逻辑相同,只是分别调用了fork函数和vfork函数和vfork函数和vfork函数创建子进程通过结果,可以看出在第一个程序(fork函数和vfork函数)的结果中,在子進程中修改了idata和istack的值等到再进入父进程时,值没有发生改变;在第二个程序(vfork函数和vfork函数)的结果中在子进程中修改了idata和istack的值,等到再进叺父进程时值发生了改变

通过这个比较可以总结如下:

1.fork函数和vfork函数()创建的子进程拥有了自己的栈和数据段拷贝,而且在子进程中對父进程变量的修改,不会影响父进程;

2.vfork函数和vfork函数()创建的子进程共享父进程的内存所以在子进程中对父进程变量的修改,会影响父进程

我要回帖

更多关于 fork函数和vfork函数 的文章

 

随机推荐