Linux主要提供了fork()、vfork()的进程创建方法。具体介绍如下。
1.fork()函数
系统调用fork()是创建一个新进程的方法。在命令行输入“manfork”,可以获得fork()函数的原型。
fork()函数有两个返回值,即调用一次返回两次。成功调用fork()函数后,当前进程实际已经分裂为两个进程:一个是原来的父进程,另一个是刚刚创建的子进程。父子进程在调用fork()函数的地方分开。fork()函数有两个返回值:一个是父进程调用fork()函数后的返回值,该返回值是刚刚创建的子进程的ID;另一个是子进程中fork()函数的返回值0。fork()函数返回两次的前提是进程创建成功。如果进程创建失败,则返回-1。
【例9-2】创建进程。
通常使用fork()函数来创建进程。
设计步骤
1)在Vim中创建一个新工程文件,命名为“example9_2.c”。
2)在“example9_2.c”中创建的代码如下所示。
3)用GCC编译并运行的结果如图9-7所示。
图9-7 用fork()函数创建进程的运行结果
2.vfork()函数(www.xing528.com)
vfork()函数的调用方法与fork()函数完全相同,也是用来创建一个新进程。
●正确返回:在父进程中返回子进程的进程号,在子进程中返回0。
●错误返回:-1。
vfork()函数与fork()函数的区别:
1)fork()要复制父进程的数据段;而vfork()则不需要完全复制父进程的数据段。在子进程没有调用exec()和exit()之前,子进程与父进程共享数据段。
2)fork()不对父子进程的执行次序进行任何限制;而在vfork()调用中,子进程先运行,父进程挂起,直到子进程调用了exec()或exit()之后,父子进程的执行次序才不再有限制。
子进程会继承父进程的许多属性,包括用户ID、组ID和当前工作目录等。子进程和父进程还有一些不同的属性,如下所示:
●子进程有自己唯一的ID。
●fork()的返回值不同,父进程返回子进程的ID,子进程的则为0。
●不同的父进程ID。
●子进程共享父进程打开的文件描述符。
●子进程不继承父进程设置的文件锁。
●子进程不继承父进程设置的警告。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。