首页 > 系统相关 >linux多进程介绍和示例

linux多进程介绍和示例

时间:2022-11-22 23:08:58浏览次数:39  
标签:fork 函数 示例 编号 pid linux 进程 返回值


 

进程的概念

什么是进程?进程这个概念是针对系统而不是针对程序员的,对程序员来说,我们面对的概念是程序。当程序员敲入命令执行一个程序的时候,对系统而言,它将启动一个进程。进程就是正在内存中运行中的程序。

Linux下一个进程在内存里有三部分的数据,就是“代码段”、”堆栈段”和”数据段”。”代码段”,顾名思义,就是存放了程序代码。“堆栈段”存放的就是程序的返回地址、程序的参数以及程序的局部变量。而“数据段”则存放程序的全局变量,常数以及动态数据分配的数据空间(比如用new函数分配的空间)。

系统如果同时运行多个相同的程序,它们的“代码段”是相同的(因为代码是已经固定不变的),“堆栈段”和“数据段”是不同的(相同的程序,处理的数据不同)。 

进程的编号

1、查看进程

ps 查看当前终端的进程

      

linux多进程介绍和示例_linux

ps -ef 查看系统全部的进程。

ps -ef |more 查看系统全部的进程,结果分页显示。

      

linux多进程介绍和示例_多进程_02

UID    :启动进程的操作系统用户。

PID    :进程编号。

PPID   :进程的父进程的编号。

C          :CPU使用的资源百分比。

STIME :进程启动时间。

TTY     :进程所属的终端。

TIME   :使用掉的CPU时间。

CMD   :执行的是什么指令。

ps -ef |grep book查看系统全部的进程,然后从结果集中过滤出包含“book”单词的记录。程序员用得最多的指令就是这个了。

      

linux多进程介绍和示例_fork_03

2、getpid库函数

getpid库函数的功能是获取本程序运行时进程的编号。

包含头文件:

#include <sys/types.h>

#include <unistd.h>

函数声明:

pid_t getpid(void);

函数没有参数,返回值是进程的编号,pid_t就是typedef int pid_t。

示例

      

linux多进程介绍和示例_fork_04

      

linux多进程介绍和示例_C++语言_05

      

linux多进程介绍和示例_linux_06

sleep(30)是为了方便查看进程。

注意两个细节:

1)进程的编号是系统动态分配的,相同的程序在不同的时间执行,进程的编号是不同的。

2)进程的编号会循环使用,但是,在同一时间,进程的编号是唯一的,也就是说,不管任何时间,系统不可能存在两个编号相同的进程。

多进程

fork在英文中是“分叉”的意思。为什么取这个名字呢?因为一个进程在运行中,如果使用了fork函数,就产生了另一个进程,于是进程就“分叉”了,所以这个名字取得很形象。下面就看看如何具体使用fork函数,这段程序演示了使用fork的基本框架。

函数声明:

pid_t fork(void);

fork函数用于产生一个新的进程,函数返回值pid_t是一个整数,在父进程中,返回值仍为进程编号,在子进程中,返回值是0。

        

linux多进程介绍和示例_多进程_07

运行结果

        

linux多进程介绍和示例_多进程_08

查看进程情况,出现了两个book进程。

        

linux多进程介绍和示例_多进程_09

初学者可能用点接受不了现实。

1)一个函数(fork)返回了两个值?

2)if和else中的代码能同时被执行?

那么调用这个fork函数时发生了什么呢?fork函数创建了一个新的进程,新进程(子进程)与原有的进程(父进程)一模一样。子进程和父进程使用相同的代码段;子进程拷贝了父进程的堆栈段和数据段。子进程一旦开始运行,它复制了父进程的一切数据,然后各自运行,相互之间没有影响。

fork函数对返回值做了特别的处理,调用fork函数之后,在子程序中fork的返回值是0,在父进程中fork的返回值仍是原进程的编号,程序员可以通过fork的返回值来区分父进程和子进程,然后再执行不同的代码。

        示例

      

linux多进程介绍和示例_linux_10

运行结果

      

linux多进程介绍和示例_C语言_11

在上文上已提到过,子进程拷贝了父进程的堆栈段和数据段,也就是说,在父进程中定义的变量子进程中会复制一个副本,fork之后,子进程对变量的操作不会影响交父进程,父进程对变量的操作也不会影响子进程,示例:

      

linux多进程介绍和示例_多进程_12

运行结果:

      

linux多进程介绍和示例_linux_13

版权声明

作者:码农有道

如果文章有错别字,或者内容有误,或其他的建议或意见,请您留言指正,非常感谢!!!

 

标签:fork,函数,示例,编号,pid,linux,进程,返回值
From: https://blog.51cto.com/u_13748800/5878690

相关文章

  • C++语言类的多态介绍和示例
         多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就可能会用到多态。    C++多态就是当调用成员函数时,会根据调用函数......
  • C++语言类的继承与派生介绍和示例
     继承    继承是面向对象程序设计中最重要的一个概念。继承允许我们根据一个类来定义另一个类,达到了代码功能重用效果。    当创建一个类时,如果待创建的类与......
  • C++语言动态内存管理介绍和示例
     C++动态内存    在C++程序中,所有内存需求都是在程序执行之前通过定义所需的变量来确定的。但是可能存在程序的内存需求只能在运行时确定的情况。在这些情况下,程序......
  • C++语言vector容器介绍和示例
         之前我们在声明数组的时候,采用的是datatype array[len]的形式,数组在分配之后,不能调整大小,删除和插入数据时操作十分的繁琐,虽然可以采用链表,但是链表的操作更......
  • C++语言类的详解和示例
     超女选秀的例子我们玩了很久,为了教学的需要,暂时离开美眉们,我将采用实际项目开发的例子。在C语言基础知识中已学习过文件操作,在实际开发中,我会把文件操作封装成一个类,类的......
  • C++语言引用的介绍和示例
         对于习惯使用C进行开发的程序员来说,在看到C++中出现的&符号,可能会犯迷糊,因为在C语言中这个符号表示了取地址符,但是在C++中,它除了取地址,还有其它的用途,叫做引用......
  • C++语言string类介绍和示例
    在C语言中,用0结尾的字符数组表示字符串,C的字符串有一个问题,就是定义后大小不能改变,存入的内容只能比数组小,不能大,如果不小心存多了,会引起内存的溢出,这个问题让程序员很郁闷......
  • C++语言类和对象介绍和示例
     C++类和对象C语言中结构体(struct)是一种构造类型,可以包含若干成员变量,可以通过结构体来定义结构体变量。C++中的类(class)可以看成结构体的升级版,类也是一种构造类型,但是进......
  • C++语言函数重载详解和示例
     C++函数重载的概念在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同。例如把变量的值写入文件,变量的类型int、long、double、char,需要通过参数把变量......
  • linux文本工具
    目录一、文本工具 1一、文本编辑工具Vim 1二、文本文件查看命令cat 3三、more命令描述:more命令从前向后分页显示文件内容。 4四、Less命令描述 4五、head命令描述 5六、s......