赞
踩
我们知道fork是一个系统调用函数,其作用是创建子进程。这个fork有许多细枝末节的难点和知识点需要我们学习并熟练掌握,我们接下来将采用代码实验的方法,深入学习fork的一些操作和难点。
1.1 查看fork使用手册
fork函数其返回值是一个pid_t类型的值,说白了就是一个无符号整型unsigned int,其形参为void,说明不用传任何参数。函数调用成功给父进程返回创建子进程的pid,并给子进程返货0,创建失败返回-1。
1.2 使用fork
写一段代码来感受一些fork的作用及返回值。
|
|
像我们下面的代码,printf(“I am running…\n”);是哪一个进程执行的?答案是当前进程,即上面的父进程,因为 fork是创建子进程,创建子进程的前提是我自己这个进程要先运行,printf是在子进程创建之前运行,也是当前进程执行。所以fork之前的代码是父进程执行,fork之后的代码(图里的while)默认是父子都可执行的。
1.3 fork两个返回值的使用
fork函数会有两次返回值,给父进程返回子进程的pid,给子进程返回0。我们可以根据fork()的这一特点来完成多执行流的运行。我们之前的时候,像if-else这种多分支判定永远只能有一个执行流,if和else if是不可能同时执行的,但是现在在这里,是可以的。
|
|
我们知道,fork是创建子进程,子进程也是一个新的进程,也是要被操作系统管理的,操作系统管理进程是要先描述再组织,描述就是将进程的各种信息封装成数据结构,管理就是操作系统对进程的管理就变成了对集成的数据结构的管理,这就是操作系统四大功能之一进程管理的本质。
那么,fork()创建子进程的过程,OS做了什么?操作系统要为子进程创建其自己的数据结构,包括PCB - task-struct,进程地址空间 - mm_struct,页表、文件系统等等,并且子进程的数据和代码来源就是父进程,所以fork后父子进程才能同时执行父进程原有的代码。
2.1 fork为何要给子进程返回0,给父进程返回子进程的pid
在现实世界中,任何一个小孩都只有一个父亲,但是一个父亲可以对应多个小孩,所以 父:孩 = 1:n 。对于父亲来说,回到家面对多个孩子肯定要具体到人名,而孩子却不需要,只需要叫爸,即父子进程立场: 父进程不需要标识,子进程需要标识。
我们fork一个子进程是要子进程执行任务,父进程需要区分子进程,而子进程不需要,因此 我们需要给父进程返回子进程的pid本质就是父进程需要通过pid区分子进程。 子进程不需要返回父进程,不需要知道父进程是谁,因为任务是父进程给他的,他只需要知道自己调用成功与否就可以,因此给自己返回0。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。