Linux环境编程06

2023-05-16

目录

  • Linux环境编程之进程管理
    • 一、进程的基本概念
    • 二、创建进程
    • 三、进程的正常退出

Linux环境编程之进程管理

一、进程的基本概念

  1. 进程与程序
    程序是存储在磁盘上的可执行文件,程序被加载到内存中开始运行时叫做进程
    一个程序可以被多次加载生成多个进程,进程就是出于活动状态的计算机程序

  2. 进程的分类
    进程一般分为三个种类:交互进程、批处理进程、守护进程

  3. 查看进程

    1. 简单模式: ps 显示当前用户有终端控制进程简单信息

    2. 列表模式: ps -auxw 显示所有进程的详细信息

      a所有用户的有终端控制的进程
      x无终端控制的进程
      u显示进程的详细信息
      w以更大的列宽显示
    3. ps -aux显示的信息

      USER进程的属主用户名
      PID进程号
      %CPUCPU的使用率
      %MEM内存的使用率
      VSZ虚拟内存使用的字节数
      RSS物理内存使用的字节数
      TTY终端设备号,? 表示无终端控制
      STAT进程的状态
      START进程的启动时间
      TIME进程运行时间
      COMMAND启动进程的命令

      其中,STAT显示的状态又分为以下几种

      O就绪态 等待被调用
      R运行态,Linux系统没有O,就绪也用R表示
      S可被唤醒的睡眠态,如系统中断、获取资源、收到信号等都可以唤醒进入运行态
      D不可被唤醒的睡眠态,只能被系统唤醒
      T暂停态 收到SIGTSTP信号进入暂停态,收到SIGCONT信号转回运行态
      X死亡态
      Z僵尸态
      N低优先级
      <高优先级
      l多线程进程
      s进程的领导者
  4. 父进程、子进程、孤儿进程、僵尸进程

    • 一个进程可以被另一个进程创建,创建者叫做父进程,被创建者叫子进程,子进程被父进程创建后会在操作系统的调度下同时运行。
    • 当子进程先于父进程结束,死前子进程会向父进程发送信号SIGCHLD,此时父进程应该去回收子进程的相关资源。
      孤儿进程:父进程先于子进程结束,子进程就变成了孤儿进程,孤儿进程会被孤儿院 (init守护进程)领养,init就是孤儿进程的父进程),在Linux目前的图形界面下,一般不会被init收养,会被Linux图形化界面的upstart收养,本质上是一样的。
      僵尸进程:该进程已死亡,但是它的父进程没有立即回收它的相关资源,该进程就进入僵尸态
  5. 进程标识符
    每个进程都有一个用非负整数表示唯一标识,即进程ID\PID,进程ID在任意时刻都是唯一的,但是可以重用,进程一旦结束它的进程ID就会被系统回收,过一段时间后再重新分配给其他新创建的进程使用(延时重用)。
    pid_t getpid(void);
    功能:返回调用者的进程ID
    pid_t getppid(void);
    功能:返回父进程的ID

二、创建进程

pid_t fork(void);
功能:创建子进程
返回值:一次调用两次返回,子进程返回0,父进程返回子进程的ID,当进程数量超过系统的限制时会创建失败,返回-1

  • 通过fork创建的子进程会拷贝父进程(数据段、bss段、堆、栈、I/O缓冲区),与父进程共享代码段、子进程会继承父进程的信号处理方式。
  • fork函数调用后父子进程各自独立运行,谁先返回不确定,但是可以通过睡眠确定让哪个进程先执行。
  • 通过fork创建的子进程可以共享父进程的文件描述符。
  • 可以根据返回值的不同让父子进程进入不同的分支,执行不同的代码。

练习1:为进程创建4个子进程,再为这4个子进程,分别创出2个子进程
解题思路:子进程创建后,执行完任务后就休眠,这样不会被其他的fork影响

pid_t vfork(void);
功能:以加载可执行文件的方式来创建子进程
返回值:子进程返回0,父进程返回子进程的ID

注意:vfork创建的子进程一定先返回,此时子进程并没有创建成功,需要加载一个可执行文件替换当前子进程当前的所有资源,当替换完成后子进程才算创建成功,此刻父进程才返回

使用 exec 系列函数让子进程加载可执行文件

extern char **environ;
int execl(const char *path, const char *arg, ...
/* (char  *) NULL */);

path:可执行文件的路径
arg:命令行参数,个数不定,由实际的可执行文件所需命令行参数决定。
一般第一个是可执行文件的名字,至少有一个,一定要以NULL结尾

int execlp(const char *file, const char *arg, ... /* (char *) NULL */);
file:可执行文件名字
arg:命令行参数,同上
注意:该命令会去系统默认路径 PATH 指定的路径下加载file

int execle(const char *path, const char *arg, ... /*, (char *) NULL, char * const envp[]*/);
path:可执行文件的路径
arg:命令行参数,同上
envp:环境变量表,父进程可以在加载子进程时把环境变量表传递给子进程

int execv(const char *path, char *const argv[]);
path:可执行文件的路径
argv:命令行参数数组,最后以NULL结尾

int execvp(const char *file, char *const argv[]);
file:可执行文件名字
argv:命令行参数数组,同上
注意:也是根据PATH的路径加载file

int execvpe(const char *file, char *const argv[], char *const envp[]);
file:可执行文件名字
argv:命令行参数数组,同上
envp:环境变量表
注意:也是根据PATH的路径加载file

exec系列函数正常情况下是不会返回的,当子进程加载失败时才会返回-1
虽然通过vfork、exec系列函数创建加载的子进程不会继承父进程的信号处理函数,但是能继承父进程的信号屏蔽集。

练习2:实现出孤儿进程和僵尸进程,可以使用ps查看stat状态来查看是否创建成功

三、进程的正常退出

  1. 在main函数中执行 return n,该返回值可以被父进程获取,几乎与exit(n)等价

  2. 进程调用了exit函数,该函数是C标准库中的函数
    void exit(int status);
    功能:在任何时间、地点调用该函数都可以立即结束进程。
    status:结束状态码 (EXIT_SUCCESS\EXIT_FAILURE),与main函数中return的返回值效果是一样的。
    返回值:该函数不会返回,直接转到另一个进程执行代码去了。

    进程退出前要完成:

    1. 先调用事先通过atexit\on_exit函数注册的函数,如果都注册了,则执行顺序与注册顺序相反。
      int atexit(void (*function)(void));
      功能:向内核注册一个进程结束前必须调用的函数。
      int on_exit(void (*function)(int,void *), void *arg);
      功能:向内核注册一个进程结束前必须调用的函数。
      arg:会在调用function时传给它。
    2. 冲刷并关闭所有打开状态的标准IO流。
    3. 底层继续调用_Exit/_exit函数。
  3. 调用_Exit/_exit函数
    void _exit(int status);
    功能:结束进程,由系统提供的
    void _Exit(int status);
    功能:结束进程,由标准库提供的

    • 它们的参数会被父进程获取到
    • 进程结束前会关闭所有处于打开状态的文件描述符
    • 向父进程发送信号SIGCHLD
    • 该函数也不会返回
  4. 进程的最后一个线程执行了return返回语句

  5. 进程的最后一个线程执行了pthread_exit函数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux环境编程06 的相关文章

  • Arch 中 fcitx5 提示拼音不可用的解决过程

    Arch 中 fcitx5 提示拼音不可用的解决过程 问题描述 xff1a 按照 Fcitx5 ArchWiKi 安装 fcitx5 后不能输入中文 xff0c 提示拼音不可用 查找解决办法 首先查看环境变量设置是否正确 xff1a etc
  • Vue3 setup函数的使用

    全新的 setup 函数 在开始编写 Vue 组件之前 xff0c 需要了解两个全新的前置知识点 xff1a 全新的 setup 函数 xff0c 关系到组件的生命周期和渲染等问题 写 TypeScript 组件离不开的 defineCom
  • Stm32的按键控制流水灯

    对于stm32的设置首先是对时钟进行启动 要求 xff1a key0控制LED0和LED1的亮 key1控制LED0和LED1的亮 kw up控制闪灯 led c span class token macro property span c
  • 头文件之间存在依赖关系该如何包含?

    本文旨在探讨头文件之间存在依赖关系时 xff0c 包含顺序的影响 分两种情况讨论 xff1a 头文件A单方面依赖头文件B xff1a struct h xff1a struct abc int num char ptr def h xff1
  • 单片机入门(利用中断控制流水灯的走向)--适合初学者

    电路图 点击下载 xff08 下载时可能会提醒不安全 xff0c 其实没事 xff0c 本博主是放在自己服务器上面 xff09 代码 span class token macro property span class token dire
  • python实现微信公众号定时消息提醒-手把手教你将代码部署到云端

    这两天微信公众号消息提醒蛮火的 xff0c 我也来蹭一下热度 xff0c 我们的主题是考研倒计时 xff0c 顺便也发一发天气预报 思路 xff1a 获取我们需要的数据 xff0c 比如天气信息 然后去微信公众平台注册一个测试号 xff0c
  • 【章节自测】第三章——顺序程序设计

    第三章 顺序程序设计 学校的老师在上程序设计这门课时 xff0c 给我们每一章指定了一些学习目标 xff0c 用于课前的预习和课后的具体检测复盘 xff0c 因为每一个目标都是具体可测的 xff0c 而只要所有的目标你都能达成 xff0c
  • C语言-进程——信号量

    system V的信号量其实是一个信号量数据 xff0c 一个sysyem V代表的是一个或多个信号量元素 信号量本质上是一个数字 xff0c 用来表征一种资源数量 xff0c 当多个进程或线程争夺这些稀缺资源的时候 xff0c 信号量用来
  • python将包(第三方库)安装到指定目录

    一 在指定目录安装python第三方库 target 61 D software anaconda envs PyTorch Lib 这里的target后面跟的是你python安装环境的lib目录 二 用指定源安装python库 这里用到了
  • Dockerfile详解

    Dockerfile 文章目录 基本结构指令详解FROMRUNLABEL MAINTAINERCOPYADDCMDENTRYPOINTENVARGVOLUMEEXPOSEWORKDIRUSERHEALTHCHECKONBUILD 创建镜像上
  • c++调用yolov4模型进行目标检测-使用opencv4.4.0

    前言 最近刚出的opencv4 4 0也支持了yolov4 xff0c 便尝试用opencv调用yolov4进行检测 xff0c 做个记录 当然 xff0c yolov3 yolov4 tiny等也能调用 xff0c 只需修改加载的cfg和
  • c++调用yolov4模型进行目标检测-使用yolov4官方接口

    前言 yolo系列用c写的 xff0c 在工程中的部署特别方便 4月份yolov4横空出世 xff0c 之前试了试效果 xff0c 精度确实有了很大的提升 xff0c AB大神nb 最近需要在C 43 43 项目中使用yolov4 xff0
  • Ubuntu 20.04安装Anaconda3及简单使用

    1 Anaconda安装包下载 xff08 1 xff09 官网下载 xff0c 下载速度较慢 xff08 2 xff09 清华大学开源软件镜像站 2 安装Anaconda xff08 1 xff09 进入文件下载目录 span class
  • 线性回归推导(二)--求闭式解法及纯python实现

    1 假设函数矩阵表示 定义样本 xff08 m个样本 xff0c 每个样本有n个特征 xff09 X 61
  • VMware 开启笔记本摄像头

    环境 xff1a VMware安装CentOS8 笔记本 xff1a windows11 一 在windows系统中打开服务 xff08 Win 43 R 输入services msc xff09 xff0c 找到VMware USB Ar
  • ROS踩坑 - sudo rosdep init失败

    问题一 问题 xff1a sudo rosdep xff1a 找不到命令 解决方案 这是因为没有安装rosdep xff0c 使用如下命令安装 span class token function sudo span span class t
  • ROS踩坑 - 解决ROS与Ananconda冲突

    一 报错情况 在Anaconda环境下用 catkin make 编译 ROS工作空间 xff0c 出现如下报错 Unable to span class token function find span either executable
  • Logistic回归推导(三)--牛顿法及纯python实现

    1 牛顿法图解 牛顿法一般用来求解方程的根或求解极值 xff0c 其基本思想是 xff1a 在现有极值点估计值附近对f x 做二阶泰勒展开 xff0c 从而找到极值点的下一个估计值 下面用一个例图说明 xff1a 如图横坐标为参数 thet
  • Nginx 配置反向代理不生效(代理到nacos集群)

    环境 xff1a centos8 相信各位安装都不成问题 xff0c 反向代理配置也都能安装网上资料配置完成 xff0c 但问题就出在配置好后启动Nginx xff0c 访问默认端口能成功 xff1a 但是访问自己配置的反向代理就会失败 x
  • 2021-01-31 VGG16

    0 总结 总结 深度很重要 主要contribution在于对网络depth作用的全面evaluation 使用堆叠3x3小卷积 xff0c depth达到16 19 用全卷积之后求和 xff0c 而不是crop xff08 OverFea

随机推荐