linux fork函数浅析

#include <sys/types.h> #include <unistd.h> /* 功能:复制进程 參数:无 返回值: 成功: 父进程:返回子进程id 子进程:返回0 失败: 返回-1 */ pid_t fork(void);

由fork创建的新进程被称为子进程(child process)。该函数被调用一次,但返回两次。两次返回的差别是子进程的返回值是0,而父进程的返回值则是新进程(子进程)的进程 id。将子进程id返回给父进程的理由是:由于一个进程的子进程能够多于一个,没有一个函数使一个进程能够获得其全部子进程的进程id。 对子进程来说,之所以fork返回0给它,是由于它随时能够调用getpid()来获取自己的pid;也能够调用getppid()来获取父进程的id。(进程id 0总是由交换进程使用,所以一个子进程的进程id不可能为0 )。

fork之后,操作系统会复制一个与父进程全然同样的子进程,虽说是父子关系,可是在操作系统看来,他们更像兄弟关系,这2个进程共享代码空间,可是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也全然同样,子进程拥有父进程当前执行到的位置(两进程的程序计数器pc值同样,也就是说,子进程是从fork返回处開始执行的),但有一点不同,假设fork成功,子进程中fork的返回值是0,父进程中fork的返回值是子进程的进程号,假设fork不成功,父进程会返回错误。
能够这样想象,2个进程一直同一时候执行,并且步调一致,在fork之后,他们分别作不同的工作,也就是分岔了。这也是fork为什么叫fork的原因

至于那一个最先执行,可能与操作系统(调度算法)有关,并且这个问题在实际应用中并不重要,假设须要父子进程协同,能够通过原语的办法解决。

 

一个fork样例

#include <unistd.h> #include <sys/types.h> #include <stdio.h> int main(void) { pid_t pid; pid=fork(); switch (pid) { case -1: perror("fork error"); exit(1); case 0: printf("I am the child process, my process id is %d/n", getpid()); break; default: printf("I am the parent process, my process id is %d/n", getpid()); break; } return 0; }

要搞清楚fork的运行过程,就必须先弄清楚操作系统中的“进程(process)”概念。一个进程,主要包括三个元素:
o. 一个能够运行的程序;
o. 和该进程相关联的所有数据(包含变量,内存空间,缓冲区等等);
o. 程序的运行上下文(execution context)。

最好还是简单理解为,一个进程表示的,就是一个可运行程序的一次运行过程中的一个状态。操作系统对进程的管理,典型的情况,是通过进程表完毕的。进程表中的每个表项,记录的是当前操作系统中一个进程的情况。对于单 CPU的情况而言,每一特定时刻仅仅有一个进程占用 CPU,可是系统中可能同一时候存在多个活动的(等待运行或继续运行的)进程。
一个称为“程序计数器(program counter, pc)”的寄存器,指出当前占用 CPU的进程要运行的下一条指令的位置。
当分给某个进程的 CPU时间已经用完,操作系统将该进程相关的寄存器的值,保存到该进程在进程表中相应的表项里面;把将要接替这个进程占用 CPU的那个进程的上下文,从进程表中读出,并更新相应的寄存器(这个过程称为“上下文交换(process context switch)”,实际的上下文交换须要涉及到很多其它的数据,那和fork无关,不再多说,主要要记住程序寄存器pc记录了程序当前已经运行到哪里,是进程上下文的重要内容,换出 CPU的进程要保存这个寄存器的值,换入CPU的进程,也要依据进程表中保存的本进程运行上下文信息,更新这个寄存器)。
好了,有这些概念打底,能够说fork了。当你的程序运行到以下的语句:pid=fork(); 

操作系统创建一个新的进程(子进程),而且在进程表中对应为它建立一个新的表项。新进程和原有进程的可运行程序是同一个程序;上下文和数据,绝大部分 就是原进程(父进程)的拷贝,但它们是两个相互独立的进程!此时程序寄存器pc,在父、子进程的上下文中都声称,这个进程眼下运行到fork调用即将返回(此时子进程不占有CPU,子进程的pc不是真正保存在寄存器中,而是作为进程上下文保存在进程表中的相应表项内)。问题是怎么返回,在父子进程中就分道扬镳。

(如果父进程一直占领CPU,实际情况非常可能不一样)父进程继续运行,操作系统对fork的实现,使这个调用在父进程中返回刚刚创建的子进程的pid(一个正整数),所以以下的swtich语句中运行了default分支(case -1,case 0分支都不满足)。所以输出I am the parent process...

子进程在之后的某个时候得到调度,它的上下文被换入,占领 CPU,操作系统对fork的实现,使得子进程中fork调用返回0,所以在这个进程(注意这不是父进程了哦,尽管是同一个程序,可是这是同一个程序的另外一次运行,在操作系统中这次运行是由另外一个进程表示的,从运行的角度说和父进程相互独立)中pid=0。这个进程继续运行的过程中,switch语句中 case -1不满足,可是case 0是满足。所以输出I am the child process..

 

程序的执行结果(先输出I am the parent process...,还是I am the parent process...)不可预见,与操作系统实际执行情况有关!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android图片保存形式,Android应用开发之Android ScrollView截图和图片保存到相册的方式...

本文将带你了解Android应用开发之Android ScrollView截图和图片保存到相册的方式&#xff0c;希望本文对大家学Android有所帮助。1.1首先来看你一种截取屏幕&#xff0c;这种代码有缺陷&#xff0c;只能截取一次Java代码 getWindow().getDecorView().setDrawingCacheEnabled…

如何在IE让用户自动下载ActiveX控件?

IE中要嵌一个ActiveX OCX&#xff0c;如何让用户在打开这个IE时自动安装并注册&#xff1f; 假如该页面完全load后并没发现需要的ocx&#xff0c;如何提示给用户? 1.做好ACTIVEX控件&#xff0c;写inf文件。打包成CAB。 2.用signcode给cab数字签名&#xff08;数字签名可到中…

ffmpeg学习笔记-native原生绘制

上次已将ffmpeg的动态库编译出来了&#xff0c;并且使用了ffmpeg的转码功能&#xff0c;成功将mp4格式视频转化为yuv视频&#xff0c;这篇文章基于上次测试的demo&#xff0c;使用surfaceview显示解码完成的像素数据 布局设置和权限添加 布局 <FrameLayout xmlns:android&qu…

CoreData一些基本概念

Core Data涉及到的几个主要的概念可以对应数据库来理解&#xff1a;NSManagedObjectContext&#xff08;托管对象上下文&#xff09;&#xff1a;数据库NSEntityDescription&#xff08;实体描述&#xff09;&#xff1a;表NSFetchRequest&#xff08;请求&#xff09;&#xf…

BDC技术(一个例子)

BDC技术 BDC&#xff08;Batch Data Conversion&#xff09;&#xff1a;在SAP系统里&#xff0c;由于某种原因&#xff0c;可能需要重复输入数据&#xff0c;&#xff08;数据不同&#xff0c;但是操作是相同的&#xff0c;典型的情形就是切换系统的时候&#xff0c;旧系统的数…

华为android怎样隐藏软件,华为怎么打开隐藏应用功能

隐藏应用是没有密码的&#xff0c;隐藏应用的方法&#xff1a;在主桌面两指分开&#xff0c;进入隐藏应用界面&#xff0c;点击(添加)&#xff0c;然后点击要隐藏的应用&#xff0c;再点击确定即可。应用锁有密码&#xff0c;是机主设定的&#xff0c;如果设置了指纹访问应用&a…

事务的传播性和隔离级别

事务的传播性&#xff1a;1、PROPOGATION_REQUIRES --需要在一个事务中执行2、PROPOGATION_SUPPOTS --不需要在一个事务中执行&#xff0c;如果有事务&#xff0c;也可以执行3 PROPOGATION_NOT_SUPPORTED --不支持在一个事务中执行&#xff0c;如果在…

Oracle建立表空间和用户

Oracle建立表空间和用户 建立表空间和用户的步骤&#xff1a; 用户 建立&#xff1a;create user username identified by "password"; 授权&#xff1a;grant create session to username;grant create table to username;grant create tablespace…

VC系统扫雷游戏外挂源代码程序下载(转帖

VC系统扫雷游戏外挂源代码程序下载&#xff08;转帖&#xff09;2008-03-04 10:25经过了多次测试写出了历史上第一个有点意义的MFC程序。效果差强人意。^_^ CODE:// CrackWinmineDlg.cpp : implementation file// #include "stdafx.h"#include "CrackWinmine.h&…

signature=54cb1c123491dc1a268a21f3502cccfc,Modelling information routing with noninterference

摘要&#xff1a;To achieve the highest levels of assurance, MILS architectures need to be formally analysed. A key challenge is to reason about the interaction between the software applications running on top of MILS core components, such as the separation…

JAVA面向对象程序设计(第二版) 袁绍欣 第四章答案

面向对象&#xff08;上&#xff09; 1.名词解释&#xff1a;构造方法、抽象 构造方法一般是用来初始化数据成员的&#xff0c;与类名相同&#xff0c;无返回值。 分为有参和无参数&#xff0c;当一个类中没有定义构造函数时&#xff0c;系统会给该类中加一个默认的空参数的构造…

转:看问题的5个层次

转自&#xff1a;http://www.narrativecard.com/%E7%9C%8B%E9%97%AE%E9%A2%98%E7%9A%845%E4%B8%AA%E5%B1%82%E6%AC%A1/ 转自&#xff1a;《创业教我的50件事》 事件当然要处理&#xff0c;就像疼痛必须注意。但若整天只忙于事件&#xff0c;就像疼了一个月还在猛吞止痛药&#…

鸿蒙系统公测版发布,鸿蒙OS2.0系统公测版什么时候发布-适配机型

鸿蒙OS2.0手机开发者Beta版本于今日已正式发布&#xff0c;那么鸿蒙OS2.0系统的公测版本上市时间&#xff0c;适配手机名单有哪些&#xff0c;接下来小编就为大家带来了解答&#xff0c;一起看看吧&#xff01;一、公测版发布时间12月16日&#xff0c;发布了鸿蒙OS2.0手机开发者…

jQuery实现分页

参考网上的资源(必优博客 http://www.biuuu.com/) 注意&#xff1a;CSS样式使分页导航水平显示&#xff0c;如果没有的话将以普通列表方式呈现。 <html><head><script type"text/javascript" src"Library/jquery1.3.1/dist/jquery.js">&…

对acm icpc 的随笔——01

1&#xff0c;提高编程能力2&#xff0c;学习算法&#xff08;读书&#xff0c;读论文&#xff0c;包括一些题目的验证&#xff09;3&#xff0c;准备好面临的挑战&#xff08;熟悉体型&#xff0c;调整心态&#xff09;4&#xff0c;启发思维 <时刻保持镇定&#xff0c;用心…

oracle常用的工具软件

PL/SQL DevelopertoadOBJECT BROWSEREmbarcadero Rapidsql转载于:https://blog.51cto.com/lsg123/1561234

angular 加入原生html,Angular HTML绑定

收到一只叮咚Angular 2.0.0和Angular 4.0.0 final仅为了安全的内容constructor(private sanitizer:DomSanitizer){}transform(style) {return this.sanitizer.bypassSecurityTrustHtml(style);//return this.sanitizer.bypassSecurityTrustStyle(style);// return this.sanitiz…

foriegn web site

http://www.codeproject.com www.ddj.com http://www.guru.com/ 转载于:https://www.cnblogs.com/liulf/archive/2009/06/11/1501670.html

Unity游戏开发之C#快速入门

C#是微软团队在开发.NET框架时开发的&#xff0c;它的构想接近于C、C&#xff0c;也和JAVA十分相似&#xff0c;有许多强大的编程功能。 个人感受是C#吸收了众多编程语言的优点&#xff0c;从中可以看到C、C、Java、Javascript、python的影子&#xff0c;设计思想都是相通的(过…

通过PowerShell获取Windows系统密码Hash

当你拿到了系统控制权之后如何才能更长的时间内控制已经拿到这台机器呢&#xff1f;作为白帽子&#xff0c;已经在对手防线上撕开一个口子&#xff0c;如果你需要进一步扩大战果&#xff0c;你首先需要做的就是潜伏下来&#xff0c;收集更多的信息便于你判断&#xff0c;便于有…