当前位置: 首页 > news >正文

Linux中并发程序设计(进程的创建和回收、exec函数使用)

进程的创建和回收

进程概念

  • 概念
    程序
    存放在磁盘上的指令和数据的有序集合(文件)
    静态的
    进程
    执行一个程序所分配的资源的总称
    动态的
  • 进程和程序比较
    在这里插入图片描述
    注:进程是存在RAM中,程序是存放在ROM(flash)中的
  • 进程内容
    BSS段:存放程序中未初始化的全局变量
    数据段:已初始化的全局变量,static声明的变量
    代码段:程序执行代码
    堆(heap):malloc等函数分配内存
    栈(stack):局部变量,函数参数,函数的返回值
    进程控制块(pcb):PID, 进程优先级,文件描述符表
  • 进程控制块
    进程标识PID、进程用户、进程状态、优先级、文件描述符表
  • 进程类型
    交互进程:在shell下启动,在前台后台运行
    批处理进程:和在终端无关,被提交到一个作业队列中以便顺序执行
    守护进程:和终端无关,一直在后台运行
  • 进程状态
    运行态、等待态、停止态、死亡态:
    在这里插入图片描述

进程常用命令

  • 查看进程信息
    ps 查看系统进程快照
    top 查看进程动态信息
    /proc 查看进程详细信息
  • 执行命令如下:
    ps:当前shell显示
    在这里插入图片描述
    ps -e :所有进程显示
    在这里插入图片描述
    ps -el:是显示详细信息
  • 具体命令参数信息如下:
    ps 命令详细参数:
    -e:显示所有进程
    -l:长格式显示更加详细的信息
    -f 全部列出,通常和其他选项联用
    表头 含义
    F 进程标志,说明进程的权限,常见的标志有两个:
    1:进程可以被复制,但是不能被执行;
    4:进程使用超级用户权限;
    S 进程状态。进程状态。常见的状态有以下几种:
    1. -D:不可被唤醒的睡眠状态,通常用于 I/O 情况。
    2. -R:该进程正在运行。
    3. -S:该进程处于睡眠状态,可被唤醒。
    4. -T:停止状态,可能是在后台暂停或进程处于除错状态。
    5. -W:内存交互状态(从 2.6 内核开始无效)。
    6. -X:死掉的进程(应该不会出现)。
    7. -Z:僵尸进程。进程已经中止,但是部分程序还在内存当中。
    8. -<:高优先级(以下状态在 BSD 格式中出现)。
    9. -N:低优先级。
    10. -L:被锁入内存。
    11. -s:包含子进程。
    12. -l:多线程(小写 L)。
    13. -+:位于后台。
      UID 运行此进程的用户的 ID;
      PID 进程的 ID;
      PPID 父进程的 ID;
      C 该进程的 CPU 使用率,单位是百分比;
      PRI 进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;
      NI 进程的优先级,数值越小,该进程越早被执行;
      ADDR 该进程在内存的哪个位置;
      SZ 该进程占用多大内存;
      WCHAN 该进程是否运行。"-"代表正在运行;
      TTY 该进程由哪个终端产生;
      TIME 该进程占用 CPU 的运算时间,注意不是系统时间;
      CMD 产生此进程的命令名;
  • 实时查看进程命令如下:
    top 查看进程动态信息
    shift +> 后翻页
    shift +< 前翻页
    top -p PID 查看某个进程
  • 改变进程优先级
    nice 按用户指定的优先级运行进程
    nice [-n NI值] 命令
    NI 范围是 -20~19。数值越大优先级越低
    普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。
    普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。
    只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。
    renice 改变正在运行进程的优先级
    renice [优先级] PID
  • 设置优先级案例如下:
    在这里插入图片描述
  • 改变优先级案例如下:
    在这里插入图片描述
  • 进程相关命令
    jobs 查看后台进程
    bg 将挂起的进程在后台运行
    fg 把后台运行的进程放到前台运行
    ctrl + z 把运行的前台进程转为后台并停止
  • 案例代码如下:
    编写一个.c文件,然后调用一个简单的sleep函数后,执行test后在另一个端口查看进程如下:
    在这里插入图片描述
    注:上述是在运行函数后,按ctrl + Z使其进程进入停止状态T

创建子进程

  • 子进程概念
    子进程为由另一个进程(对应称之为父进程)所创建的进程,实际上你在linux中写程序都是别人创建的,比如运行.test文件时,就是shell的子进程
  • 子进程创建-fork
    #include <unistd.h>
    pid_t fork(void);
    创建新的进程,失败时返回-1
    成功时父进程返回子进程的进程号,子进程返回0
    通过fork的返回值区分父进程和子进程
  • 创建子进程案例如下:
    在这里插入图片描述
    注:创建子进程时虽然会复制父进程的代码,但是不会从头开始执行,而是从创建fork函数下方的时候执行,所以子进程没有赋予相应的进程号,但是系统默认给了0,下面图片显示得很清楚
    在这里插入图片描述
    要点:1 子进程只执行fork之后的代码
    父子进程执行顺序是操作系统决定的。
  • 父子进程
    子进程继承了父进程的内容
    父子进程有独立的地址空间,互不影响
    若父进程先结束
    子进程成为孤儿进程,被init进程收养
    子进程变成后台进程
    若子进程先结束
    父进程如果没有及时回收,子进程变成僵尸进程
  • 父子进程案例如下:
    在这里插入图片描述
  • 运行如下:
    在这里插入图片描述
    注:可以得出父子进程没有什么特定的关系,是系统随机调用的
  • 通过父进程号看出子进程和父进程
    在这里插入图片描述
  • 在用kill -9 杀死父进程,然后可以发现子进程的父进程PPID变成1,也就是init进程中,然后另一个终端ctrl + c结束不掉,说明以及变为后台进程了
    在这里插入图片描述
    注:有些新版的ubuntu系统子进程可能被其他进程领养,例如:systemd作为最新的初始化系统(init)来提高系统的启动速度。这和进程1的init是一个道理不要疑惑。

子进程进阶例题

  • 一个父进程拥有五个子进程,代码如下: 在这里插入图片描述
  • 运行结果如下:
    在这里插入图片描述
    注:可以看出出现了孙进程的情形,因为上述代码中for循环语句,使子进程执行完fork函数下面的语句后,由于for内部是一个循环语句,因此子进程也执行了一次fork函数所以出现孙进程的情形
  • 解决办法如下:
    在这里插入图片描述
    注:在子进程语句中末尾加入break即可

进程的退出

  • 进程结束-exit/_exit
    #include <stdlib.h>
    #include <unistd.h>
    void exit(int status);
    void _exit(int status);//不刷新流缓冲区
    结束当前的进程并将status返回
    exit结束进程时会刷新(流)缓冲区
    return 和exit的区别
    main函数结束时会隐式地调用exit函数,普通函数return是返回上一级。
  • 案例如下:
    在这里插入图片描述
  • 执行如下:
    在这里插入图片描述
    注:这里要注意exit(0)相当于return 0,所以printf(“after exit”)不会被调用,因此终端上不显示,而且不要以为return在任何情况下都会隐式调用exit,只有main函数下才会调用exit,要牢记!

进程的回收

  • 进程回收-wait
    #include <unistd.h>
    pid_t wait(int *status);
    成功时返回回收的子进程的进程号;失败时返回EOF
    若子进程没有结束,父进程一直阻塞
    若有多个子进程,哪个先结束就先回收
    status 指定保存子进程返回值和结束方式的地址
    status为NULL表示直接释放子进程PCB,不接收返回值
  • 例子代码如下:
    在这里插入图片描述
    注:因为status里面包含地址和进程返回值,不能直接输出,需要通过宏来判断
  • 执行后使用ps查看进程的状态,看是否由僵尸进程,也就是判断exit是否收回子进程,如下:
    在这里插入图片描述
  • 查看注释wait那两行后的ps状态如下:
    在这里插入图片描述
    注:可以看出多出一个wait僵尸进程(即僵尸进程)
  • 进程回收-waitpid
    #include <unistd.h>
    pid_t waitpid(pid_t pid, int *status, int option);
    参数:
    pid:
    pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。
    pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。
    pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。
    pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。
    options:
    options提供了一些额外的选项来控制waitpid,目前在Linux中只支持WNOHANG和WUNTRACED两个选项,这是两个常数,可以用"|"运算符把它们连接起来使用
    WNOHANG :若由pid指定的子进程未发生状态改变(没有结束),则waitpid()不阻塞,立即返回0
    WUNTRACED: 返回终止子进程信息和因信号停止的子进程信息
    wait(wait_stat) 等价于waitpid(-1,wait_stat,0)
  • 案例如下:
    在这里插入图片描述
    注:ps查看进程后也是回收的,也可以将-1改为pid,因为上面代码只有一个子进程
  • 有一个案例要注意下如下:
    在这里插入图片描述
  • 执行如下:
    在这里插入图片描述
    注:可以得出在休息1s后下面的waitpid先执行,然后WNOHANG的话上述也有解释,若pid进程未发生状态改变返回0,状态值也返回异常,那么如何解决这个问题呢,如下
  • 修改后代码代码如下:
    在这里插入图片描述
  • 修改如下:
    在这里插入图片描述
    注:可以发现修改完成

相关文章:

Linux中并发程序设计(进程的创建和回收、exec函数使用)

进程的创建和回收 进程概念 概念 程序 存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09; 静态的 进程 执行一个程序所分配的资源的总称 动态的进程和程序比较 注&#xff1a;进程是存在RAM中&#xff0c;程序是存放在ROM(flash)中的进程内容 BSS段&#xff…...

2023年DevOps国际峰会暨 BizDevOps 企业峰会(DOIS北京站):核心内容与学习收获(附大会核心PPT下载)

随着科技的飞速发展&#xff0c;软件开发的模式和流程也在不断地演变。在众多软件开发方法中&#xff0c;DevOps已成为当下热门的软件开发运维一体化模式。特别是在中国&#xff0c;随着越来越多的企业开始认识到DevOps的价值&#xff0c;这一领域的研究与实践活动日益活跃。本…...

pdf 转html 在线预览和查询

方案一&#xff1a;pdf2htmlex package com.realize.controller;import cn.hutool.http.HttpUtil; import com.alibaba.fastjson2.JSONObject; import com.realize.util.MsgUtil; import com.realize.util.OssUtil; import com.realize.util.PdfConvertUtil; import com.reali…...

docker 体验怀旧游戏(魂斗罗等)

docker run --restart always -p 8081:80 --name fc-games -d registry.cn-hangzhou.aliyuncs.com/bystart/fc-games:latest ip:8081访问 jsnes: js制作了一个网页版的NES模拟&#xff0c;可以在网页上玩fc游戏 (gitee.com)...

JS中判断数据类型总结以及方法封装

判断数据类型封装方法&#xff1a; 1&#xff09;type返回字符串类型 2&#xff09;is开头返回Boolean类型 测试实例&#xff1a; JavaScript 判断数据类型的方式共有四种 typeofinstanceofconstructorObject.prototype.toString typeof typeof 操作符返回一个字符串,表示操…...

【Midjourney】绘画风格关键词

1.松散素描(Loose Sketch) "Loose sketch"&#xff08;松散素描&#xff09;通常指的是一种艺术或设计中的手绘风格&#xff0c;其特点是线条和形状的表现相对宽松、自由&#xff0c;没有过多的细节和精确度。这样的素描通常用于表达创意、捕捉概念或者作为设计的初步…...

教你如何低成本自建「幻兽帕鲁」服务器,快速一键部署

创建幻兽帕鲁服务器1分钟部署教程&#xff0c;阿里云和腾讯云均推出幻兽帕鲁服务器服务器和部署教程&#xff0c;4核16G和4核32G配置可选&#xff0c;阿腾云atengyun.com分享1分钟自建幻兽帕鲁Palworld服务器教程&#xff1a; 幻兽帕鲁服务器创建教程 幻兽帕鲁服务器官方推荐…...

拥抱社交电商浪潮:微信小程序商城崛起引领电商新风向-亿发

在经过多年的发展后&#xff0c;各大传统电商平台的流量增速基本上已经见顶。同时&#xff0c;新兴的带有社交性质的电商平台&#xff0c;如抖音、小红书和微信商城&#xff08;小程序商城&#xff09;等&#xff0c;使得传统中心化平台的流量关注度逐渐分散。由于中心化平台需…...

一个使用pyqt的word文档查重工具

一个使用pyqt的word文档查重工具 使用场景代码使用截图打包好的软件下载链接结尾 使用场景 有时我们在借鉴一篇文档之后还不想有太多重复&#xff0c;这个时候可以使用这个工具对两个word文档进行对比 代码 import sys from PyQt5.QtWidgets import QApplication, QMainWind…...

SpringCloud Alibaba Sentinel 与 SpringCloud Gateway 的限流有什么差别?(三种限流算法原理分析)

目录 一、Sentinel 与 Gateway 的限流有什么差别&#xff1f; 1.1、前置知识 - 四种常见的限流算法 1.1.1、Tips 1.1.2、计数器算法 1&#xff09;固定窗口计数器算法 2&#xff09;滑动窗口计数器算法 1.1.3、令牌桶算法 1.1.4、漏桶算法 1.2、解决问题 一、Sentinel…...

邦芒忠告:职场新人最需要避开的十大雷坑

职场人最害怕的就是踩雷进坑&#xff0c;很多新入职场的小白都会战战兢兢&#xff0c;生怕哪里不对&#xff0c;冒犯了哪一位&#xff0c;或者触犯了哪一条潜规则。害怕自己踩到雷&#xff0c;没有走好职场第一步。最近&#xff0c;单位进了几个新人&#xff0c;看到他们就想起…...

MySQL-进阶-索引

一、索引概述 1、介绍 2、有误索引搜索效率演示 3、优缺点 二、索引结构 1、B-Tree&#xff08;多路平衡查找树&#xff09; 2、BTree 3、Hash 三、索引分类 四、索引语法 1、语法 2、案例 五、SQL性能分析 1、查看执行频次 2、慢查询日志 3、show-profile 4、explain...

GitLab入门指南:上传与下载操作一网打尽

GitLab简介&#xff1a; GitLab是一个基于Git的开源仓库管理系统&#xff0c;提供了一个Web界面的Git存储库管理器&#xff0c;并集成了多种开发工具的功能&#xff0c;如代码审查、问题跟踪、持续集成和持续部署等。GitLab可以在本地服务器上部署&#xff0c;也可以使用其提供…...

GPT应用_PrivateGPT

项目地址&#xff1a;https://github.com/imartinez/privateGPT 1 功能 1.1 整体功能&#xff0c;想解决什么问题 搭建完整的 RAG 系统&#xff0c;与 FastGPT 相比&#xff0c;界面比较简单。但是底层支持比较丰富&#xff0c;可用于知识库的完全本地部署&#xff0c;包含大…...

Qt‘s 撤销框架(Qt‘s Undo Framework)

一、开篇序言 我们常常有这样的业务场景,需要支持撤回的动作(即 undo)。如果让你来设计,聪明的你肯定也能立即想到解决问题的办法,对,将操作的 command { 对象,指令,属性 } 保存到一个容器中。 如果是仅需要单步撤销, 使用栈容器 保存command,动作执行即指令入栈, …...

【C++】stack、queue的使用及模拟实现

目录 一、stack1.1 stack的使用1.2 stack的模拟实现 二、queue2.1 queue的使用2.2 queue的模拟实现 一、stack 1.1 stack的使用 stack是一种容器适配器&#xff0c;它的特点是后进先出&#xff0c;只能在容器的一端进行插入和删除操作。 stack的使用很简单&#xff0c;主要有…...

外包干了2个多月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

html5实现好看的年会邀请函源码模板

文章目录 1.设计来源1.1 邀请函主界面1.2 诚挚邀请界面1.3 关于我们界面1.4 董事长致词界面1.5 公司合作方界面1.6 活动流程界面1.7 加盟支持界面1.8 加盟流程界面1.9 加盟申请界面1.10 活动信息界面 2.效果和源码2.1 动态效果2.2 源码目录结构 源码下载 作者&#xff1a;xcLei…...

【C++】反向迭代器模拟实现

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.利用适配器的思想…...

【低照度图像增强系列(5)】Zero-DCE算法详解与代码实现(CVPR 2020)

前言 ☀️ 在低照度场景下进行目标检测任务&#xff0c;常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题&#xff0c;给检测带来一定的难度。 &#x1f33b;使用图像增强模块对原始图像进行画质提升&#xff0c;恢复各类图像信息&#xff0c;再使用目标…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...