进程的创建fork()

进程的创建

此博客的内容是根据书《linux/UNIX 系统编程手册》的第24章总结的。写博客的目的是为了自己记得更深点。

fork()

最近在代码中看到fork()函数,系统通过fork()允许一进程(父进程)创建一个新的进程(子进程)。但是我在code中只看到了对子进程的操作,那这就有个疑问:

    code中只有对子进程的操作,那为什么还要创建子进程,父进程不是一样能够完成任务?

答:一般情况下,在一个进程中创建子进程是为了,让子进程和父进程完成不同的任务,如父进程走a流程,子进程完成b流程。但是子进程也可以完成与父进程完全相同的流程。由于子进程与父进程将执行相同的程序文本,但是却各自拥有不同的栈段、数据段以及堆段拷贝。则子进程对各自堆栈的修改将不会影响父进程的堆栈数据和变量。

创建新的进程

某个网络服务器在监听客户端请求的同时,为每一个请求创建一个新的子进程处理这个请求,与此同时服务器继续监听更多的客户端连接请求。从而提高系统的并发性。

#include <unistd.h>
pid_t fork();
从而将存在两个进程,并且都是从fork的返回处继续执行。

两个进程将执行相同的程序文本段,但是各自拥有不同的栈段、数据段和堆栈数据拷贝。子程序的栈、数据和堆段开始是对父进程的完全复制,执行fork()后,每个进程均可修改各自的堆栈段和数据,并不会影响另一个进程。
在程序code中,code通过fork()的返回值区分父、子进程,在父进程中,将返回新创建的子进程的进程ID。在子进程中,将返回0。若创建子进程失败,则返回-1。并且在code,在子进程可以通过函数getpid()获得自己的进程ID,通过getppid()获得父进程的进程ID。

调用fork()后,系统将率先执行哪个进程是无法确定的。
这种不确定性可能会导致所谓的“竞争条件”错误。可是使用sleep或wait。
1)使用sleep()(存在于父进程代码中),意在允许子进程先于父进程获得系统调用并使用CPU,以便于父进程继续运行之前完成自身任务并退出。
2)使用wait(),父进程可以使用系统调用wait()来暂停运行并等待子进程运行,如wait(&status)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值