Linux使用父进程和子进程进行数据的累加

首先我们明确什么是进程:

标准定义:进程是一个具有一定独立功能的程序在一个数据集合上依次动态执行的过程。进程是一个正在执行程序的实例,包括程序计数器、寄存器和程序变量的当前值。

简单来说进程就是一个程序的执行流程,内部保存程序运行所需的资源。

在操作系统中可以有多个进程在运行,可对于CPU来说,同一时刻,一个CPU只能运行一个进程,但在某一时间段内,CPU将这一时间段拆分成更短的时间片,CPU不停的在各个进程间游走,这就给人一种并行的错觉,像CPU可以同时运行多个进程一样,这就是伪并行。

进程的创建:

用户在使用 Linux 系统的时候,每次在终端下面输入一行命令,就由 shell 进程接收这个命令并创建一个新的进程,这个新的进程还可以通过 fork()系统调用,继续创建自己的子进程。系统中的多
个进程构成一棵进程树。实际上,在 Linux 系统启动时,最早产生的进程是 idle 进程,其 pid 号为 0,该进程会创建一个内核线程,该线程进行一系列初始化动作后最终会执行/sbin/init 文件,执行该文件的结果是运行模式从核心态切换到用户态,该线程演变成了用户进程 init,pid 为 1。init 进程是一个非常重要的进程,一切用户态进程都是它的后代进程。

调用fork()函数执行流程:

调用 fork 时,系统将创建一个与当前进程相同的新进程,其与原有进程具有相同的数据、连接
关系和在程序同一处执行的连续性。原进程称为父进程,新生进程称为子进程。子进程是父进程的
一个拷贝,子进程获得同父进程相同的数据,但是同父进程使用不同的数据段和堆栈段。子进程被
创建以后,处于可运行状态,与父进程以及系统中的其他进程平等地参与系统调度。
fork 调用将执行两次返回,即分别从父进程和子进程分别返回,即子进程一旦创建就绪,就与
父进程一样被平等地调度执行。因此,从 fork 返回以后,不能确切知道执行哪一个进程。从父进程返回时,返回值(>0)为子进程的进程标识号 PID;而从子进程返回时,返回值为 0,并且返回都将执行 fork 之后的语句。调用出错时返回值为-1,并将 errno 置为相应值。
调用 vfork 的作用与 fork 基本相同,但 vfork 并不完全拷贝父进程的数据段,而是和父进程共享
数据段。调用执行 vfork 函数返回之前,父进程被阻塞,子进程先运行,直到从 vfork 调用返回。然后,子进程继续执行,可以调用 exec 执行新的进程,或调用 exit 结束其运行。此后,父进程才被唤醒,与子进程平等地被系统调度。因此,如果子进程在调用 exec 之前等待父进程,由于父进程因为执行 vfork 被阻塞,会造成死锁。
函数 vfork 的主要用途是创建子进程以后,由子进程调用 exec 函数启动其他进程,使新启动的
其他进程以该子进程的进程标识号身份执行,但拥有自己的程序段和数据区。

pipe()管道通信:

要实现进程间数据的调用,就需要用到管道通信了。管道通信就是实现进程间的通信或者说想要使用另一个进程的计算得到的结果。父进程和子进程,或两个兄弟进程之间使用的管道称为无名管道,无名管道是半双工的,数据在同一时刻只能在一个方向上流动,也就是说,数据只能从管道的一端写入,从另一端读出,其次是管道只存在于内存(内核缓冲区)中,不是普通的文件,也不属于某个文件系统。从管道读数据是一次性操作,数据一旦被读走,它就从管道中丢弃,释放空间以便写更多的数据。

基于以上基础知识,实现进程间数据累加如下:

父进程对1到10000进行累加,子进程对10001到20000进行累加,最后输出两个进程累加之和。

代码如下:



 

 运行结果如下:


 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值