linux多进程介绍和示例
进程的概念
什么是进程?进程这个概念是针对系统而不是针对程序员的,对程序员来说,我们面对的概念是程序。当程序员敲入命令执行一个程序的时候,对系统而言,它将启动一个进程。进程就是正在内存中运行中的程序。
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多进程介绍和示例相关推荐
- Linux多线程与Linux多进程混合项目的死锁问题
目录 背景 线程和fork 内核原理分析 背景 本文并不是介绍Linux多进程多线程编程的科普文,如果希望系统学习Linux编程,可以看<Unix环境高级编程>第3版>. 本文是描述 ...
- linux内核模块是什么,Linux内核模块介绍,使用Linux模块的优点
描述 1.1 Linux内核模块介绍1.1.1 Linux内核模块概述 嵌入式设备驱动开发中将驱动程序以模块的形式发布,更是极大地提高了设备使用的灵活性--用户只需要拿到相关驱动模块,再插入到用户的内 ...
- 1.Linux Cluster介绍+LB Cluste详解
Linux Cluster ============================================================================== 概述: 本章 ...
- mysql创建表分区详细介绍及示例
mysql创建表分区详细介绍及示例 1. 基本概念 1.1 什么是表分区? 1.2 表分区与分表的区别 1.3 表分区有什么好处? 1.4 分区表的限制因素 2. 如何判断当前MySQL是否支持分区? ...
- Linux多进程多线程编程笔记
文章目录 Linux多进程多线程编程 一.多进程编程 1.fork 函数 2.exec 系列函数 3.wait.waitpid 函数 4.pipe 管道 5.信号量 5.1.semget 5.2.se ...
- Linux多进程4种策略实现哲学家进餐问题
1. 任务简介 一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭.哲学家们倾注毕生的精力用于思考和进餐,哲学家在思考时,并不影响他人.只有当哲学家饥饿时,才试图拿起左. ...
- HTTP服务器项目2:Linux多进程开发
HTTP服务器项目2:Linux多进程开发 1.进程概述: 01 / 程序和进程 程序是包含一系列信息的文件,这些信息描述了如何在运行时创建一个进程: ◼ 二进制格式标识:每个程序文件都包含用于描述可 ...
- Linux 多进程开发
Linux多进程开发 文章目录 进程概述 程序与进程 单道.多道程序设计 时间片 并行和并发 进程状态转换 进程的状态 进程相关命令 进程号和相关函数 进程创建 父子进程的虚拟地址空间 父子进程之间的 ...
- Linux -- 多进程编程之 - 守护进程
内容概要 一.守护进程概述 二.守护进程创建 2.1.创建子进程,父进程退出 2.2.在子进程中创建新会话 2.2.1.进程组和会话期 2.2.2.setsid()函数说明 2.3.改变当前工作目录 ...
最新文章
- 让程序主窗口不显示在任务栏中
- JavaSE(十三)——Swing
- OpenCV尺寸调整函数resize
- 快速提示:消息驱动Bean中的异常处理
- Netty自娱自乐之协议栈设计
- 读书笔记—《销售铁军》随记3
- 利用反射做一个简易 Spring IOC 容器,模仿其装配功能
- 网络嗅探器如何嗅探_SQL Server中的运行时常量嗅探
- gan怎么输入一维数据_GAN评价指标最全汇总
- java虚拟机进程_Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行...
- Java多线程——线程安全问题
- VirtualBox安装Windows和CentOS虚拟机
- 一起来学PCB-0.4-STM32F072C8T6最小核心板原理图设计
- 三种方法破解系统管理员密码
- 二维码门禁助力于打造更智能化的出入管理-码上开门,说走就走
- Microsoft Teams管理(一)
- Mac上的PowerPoint保存时出现“连同字体保存”——“某些字体无法随演示文稿一起保存。仍然要保存演示文稿吗?”
- 开源Go语言数值算法库 An open numerical library purely based on Go programming language
- 【硬件】机器人平台搭建
- Spice语法及调用
热门文章
- Python+matplotlib绘制多门课程学生成绩分布饼状图
- 图解Python多修饰器时哪个先起作用
- php 2m限制,取消php上传2M的限制
- 机器学习方法_机器学习大拿253页新书:可解释机器学习方法的局限籍(附下载)...
- python 从数据库 提取数据 生成html_python如何将数据生成html文件+浏览器中文显示乱码问题...
- java键盘监听keyadapter_JAVA 键盘监听当中,释放键盘并没有停止运动
- linux重启后版本变了,linux – 重启后如何使设备映射保持不变?
- linux脚本base64加密当时,【加密算法】Base64
- python爬取json数据_Python爬取数据保存为Json格式的代码示例
- 魅族android n内测报名,底层升级安卓 N 内测报名 Flyme 迎来五周年