进程的概念

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

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

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

进程的编号

1、查看进程

ps 查看当前终端的进程

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

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

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

PID    :进程编号。

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

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

STIME :进程启动时间。

TTY     :进程所属的终端。

TIME   :使用掉的CPU时间。

CMD   :执行的是什么指令。

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

2、getpid库函数

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

包含头文件:

#include <sys/types.h>

#include <unistd.h>

函数声明:

pid_t getpid(void);

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

示例

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

注意两个细节:

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

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

多进程

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

函数声明:

pid_t fork(void);

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

运行结果

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

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

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

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

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

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

示例

运行结果

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

运行结果:

版权声明

C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。

来源:C语言技术网(www.freecplus.net)

作者:码农有道

如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发我的文章,谢谢!!!

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

linux多进程介绍和示例相关推荐

  1. Linux多线程与Linux多进程混合项目的死锁问题

    目录 背景 线程和fork 内核原理分析 背景 本文并不是介绍Linux多进程多线程编程的科普文,如果希望系统学习Linux编程,可以看<Unix环境高级编程>第3版>. 本文是描述 ...

  2. linux内核模块是什么,Linux内核模块介绍,使用Linux模块的优点

    描述 1.1 Linux内核模块介绍1.1.1 Linux内核模块概述 嵌入式设备驱动开发中将驱动程序以模块的形式发布,更是极大地提高了设备使用的灵活性--用户只需要拿到相关驱动模块,再插入到用户的内 ...

  3. 1.Linux Cluster介绍+LB Cluste详解

    Linux Cluster ============================================================================== 概述:  本章 ...

  4. mysql创建表分区详细介绍及示例

    mysql创建表分区详细介绍及示例 1. 基本概念 1.1 什么是表分区? 1.2 表分区与分表的区别 1.3 表分区有什么好处? 1.4 分区表的限制因素 2. 如何判断当前MySQL是否支持分区? ...

  5. Linux多进程多线程编程笔记

    文章目录 Linux多进程多线程编程 一.多进程编程 1.fork 函数 2.exec 系列函数 3.wait.waitpid 函数 4.pipe 管道 5.信号量 5.1.semget 5.2.se ...

  6. Linux多进程4种策略实现哲学家进餐问题

    1. 任务简介 一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭.哲学家们倾注毕生的精力用于思考和进餐,哲学家在思考时,并不影响他人.只有当哲学家饥饿时,才试图拿起左. ...

  7. HTTP服务器项目2:Linux多进程开发

    HTTP服务器项目2:Linux多进程开发 1.进程概述: 01 / 程序和进程 程序是包含一系列信息的文件,这些信息描述了如何在运行时创建一个进程: ◼ 二进制格式标识:每个程序文件都包含用于描述可 ...

  8. Linux 多进程开发

    Linux多进程开发 文章目录 进程概述 程序与进程 单道.多道程序设计 时间片 并行和并发 进程状态转换 进程的状态 进程相关命令 进程号和相关函数 进程创建 父子进程的虚拟地址空间 父子进程之间的 ...

  9. Linux -- 多进程编程之 - 守护进程

    内容概要 一.守护进程概述 二.守护进程创建 2.1.创建子进程,父进程退出 2.2.在子进程中创建新会话 2.2.1.进程组和会话期 2.2.2.setsid()函数说明 2.3.改变当前工作目录 ...

最新文章

  1. 让程序主窗口不显示在任务栏中
  2. JavaSE(十三)——Swing
  3. OpenCV尺寸调整函数resize
  4. 快速提示:消息驱动Bean中的异常处理
  5. Netty自娱自乐之协议栈设计
  6. 读书笔记—《销售铁军》随记3
  7. 利用反射做一个简易 Spring IOC 容器,模仿其装配功能
  8. 网络嗅探器如何嗅探_SQL Server中的运行时常量嗅探
  9. gan怎么输入一维数据_GAN评价指标最全汇总
  10. java虚拟机进程_Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行...
  11. Java多线程——线程安全问题
  12. VirtualBox安装Windows和CentOS虚拟机
  13. 一起来学PCB-0.4-STM32F072C8T6最小核心板原理图设计
  14. 三种方法破解系统管理员密码
  15. 二维码门禁助力于打造更智能化的出入管理-码上开门,说走就走
  16. Microsoft Teams管理(一)
  17. Mac上的PowerPoint保存时出现“连同字体保存”——“某些字体无法随演示文稿一起保存。仍然要保存演示文稿吗?”
  18. 开源Go语言数值算法库 An open numerical library purely based on Go programming language
  19. 【硬件】机器人平台搭建
  20. Spice语法及调用

热门文章

  1. Python+matplotlib绘制多门课程学生成绩分布饼状图
  2. 图解Python多修饰器时哪个先起作用
  3. php 2m限制,取消php上传2M的限制
  4. 机器学习方法_机器学习大拿253页新书:可解释机器学习方法的局限籍(附下载)...
  5. python 从数据库 提取数据 生成html_python如何将数据生成html文件+浏览器中文显示乱码问题...
  6. java键盘监听keyadapter_JAVA 键盘监听当中,释放键盘并没有停止运动
  7. linux重启后版本变了,linux – 重启后如何使设备映射保持不变?
  8. linux脚本base64加密当时,【加密算法】Base64
  9. python爬取json数据_Python爬取数据保存为Json格式的代码示例
  10. 魅族android n内测报名,底层升级安卓 N 内测报名 Flyme 迎来五周年