LINUX---进程

news2024/9/20 22:48:40

目录

  • 相关概念
    • 1.什么是程序,什么是进程,有什么区别
    • 2.如何查看系统中有哪些进程
    • 3.进程标识符
    • 4.父进程,子进程
    • 5.C程序的存储空间是如何分配的
  • 创建进程函数fork
  • vfork
      • fork创建进程:
      • vfork创建进程:
  • 进程退出
      • 正常退出:
      • 异常退出:
  • 父进程等待子进程退出
      • 1.为什么要等子进程退出?
      • 2.wait函数有两种:
        • 1.pid_t wait(int *status)
        • 2.pid_t waitpid(pid_t,int *status,int options)(暂时了解)
  • 孤儿进程
  • exec族函数
      • 小应用:写一个程序,能调用出系统时间。
  • exec配合fork使用:
  • system函数
  • popen函数

相关概念

1.什么是程序,什么是进程,有什么区别

程序是静态的概念,gcc xxx.c -o pro
磁盘中生成pro文件,叫做程序。
桌面上的软件都叫程序,并没有跑起来。跑起来叫进程
进程是程序的一次运行活动,程序跑起来了,系统中就多了一个进程。

2.如何查看系统中有哪些进程

1.ps或ps -aux 可以查看linux下的所有进程。
如果需要仔细筛选想看的进程可以使用grep过滤。
例如:ps -aux|grep init 查找所有带init的进程。
2.用top指令(类似windows的任务管理器),可以显示相关的CPU 内存。可以用来评估一个程序的CPU占用情况。

3.进程标识符

1.每个进程都有一个非负整数表示唯一的ID,叫pid,类似身份证。
2.在操作系统中,默认pid=0是交换进程的pid.
作用是进程调度。
默认pid=1是init进程。
作用是系统初始化。

程序运行起来时,运行的第一个进程就是init进程。

3.编程调用getpid 函数获取自身的进程标识符,
getppid获取父进程的进程标识符
在这里插入图片描述

4.父进程,子进程

进程a创建了进程b,a就是父进程,b就是子进程

5.C程序的存储空间是如何分配的

在这里插入图片描述
堆:调用malloc等申请空间在这里,也就是malooc返回值都在这里
栈:保存局部变量等等
高地址那行存放argc,argv那些东西
bss段:函数外未被初始化的变量

创建进程函数fork

fork函数调用成功,返回两次。
返回值为0,代表当前进程是子进程。
返回值非负数,代表当前进程为父进程。
在这里插入图片描述
在这里插入图片描述
参考博文:

创建子进程的目的:
1.父进程复制自己(子进程),使父子同时执行不同的代码段。常用于网络编程:父进程等待客户端的服务请求,当请求到达时,父进程调用fork,使子进程处理此请求,父进程则继续等待下一个服务请求到达。

vfork

也可以创建进程,和fork的区别:
1.vfork直接使用父进程存储空间,不拷贝。
2.vfork保证子进程先运行,当子进程调用exit退出后,父进程才执行

fork创建进程:

在这里插入图片描述
在这里插入图片描述

vfork创建进程:

在这里插入图片描述

在这里插入图片描述
上述编译结果证明了vfork保证子进程先运行


在这里插入图片描述

在这里插入图片描述
上述编译结果证明当子进程调用exit退出后,父进程才执行

进程退出

正常退出:

1.main函数调用return
2.进程调用exit()标准库
3.进程调用_exit()或者_Exit(),属于系统调用。
4.进程最后一个线程返回
5.最后一个线程调用pthread_exit

异常退出:

1.调用abort,相当于放弃当前进程
2.当进程收到某些信号时,入CTRL C
3.最后一个线程对取消(cancellation)请求做出响应

不管是什么退出,内核都会为打开的进程释放存储器,关闭打开的描述符。
父进程可以调用wait或waitpid来收集子进程的退出状态

父进程等待子进程退出

1.为什么要等子进程退出?

父进程等待子进程退出原因:
创建子进程的目的是让他干活,是否干完(干完就是正常退出,
没干完就是异常退出)正常退出有很多种退出码,
通过分析退出码来判断子进程的工作情况

1.父进程通过调用wait函数,会返回状态码(收集退出状态)。
2.子进程退出状态不被收集会编程僵尸进程(Z+)(作为了解)
在这里插入图片描述

3.使用wait函数时,如果没有任何子进程,则立即出错返回。

2.wait函数有两种:

1.pid_t wait(int *status)

status:状态码,是一个整型指针
非空:子进程退出状态放在它所指向的地址中
空:不关心退出状态。

在这里插入图片描述

在这里插入图片描述
收集状态后如何判断子进程的退出状态?用宏:

wait所返回的终止状态的宏:
WIFEXITED(status):
若为正常终止子进程返回的状态,则为真,对于这种情况,
可执行WIFEXITED(status),取子进程传给exit,
_exit或_Exit参数的低8位

WIFSIGNALED(staus):
若为异常终止子进程返回的状态,则为真,对于这种情况,
可执行WTERMSIG(status),取使子进程终止的信号编号。

用法实例:
在这里插入图片描述

2.pid_t waitpid(pid_t,int *status,int options)(暂时了解)

pid参数的作用解释:
pid>0 等待其进程ID与pid相等的子进程。(常用)
pid == -1等待任一子进程。这一方面,waitpid=wait
pid == 0 等待其组ID等于调用进程组ID的任一子进程
pid < -1 等待其组ID等于pid绝对值的任一子进程。

wait和waitpid区别:
wait使调用者阻塞,
waitpid有一个选项,可使调用者不阻塞。

孤儿进程

父进程不等待子进程退出,在子进程结束前就结束了自己的生命,此时子进程叫孤儿进程。
LINUX避免系统有很多孤儿进程,init进程收留孤儿进程,成为孤儿进程的父进程。

exec族函数

https://blog.csdn.net/u014530704/article/details/73848573
参考博文: https://blog.csdn.net/u014530704/article/details/73848573

简单理解exec:
fork一个进程后,程序跑到一半,让他执行另外一个程序,就调用exec.

小应用:写一个程序,能调用出系统时间。

1.先使用指令 whereis date 查看date所属路径。
在这里插入图片描述
2.

3.在这里插入图片描述

exec配合fork使用:

实现功能:
当父进程检测到输入为1时,创建子进程把配置文件的字段值修改掉
在这里插入图片描述
changedata是修改程序

system函数

功能同execl

参考博文
exec和system函数区别:
system是用shell来调用程序=fork+exec+waitpid,而exec是直接让你的程序代替用来的程序运行。
system 是在单独的进程中执行命令,完了还会回到你的程序中。而exec函数是直接在你的进程中执行新的程序,新的程序会把你的程序覆盖,除非调用出错,否则你再也回不到exec后面的代码,就是说你的程序就变成了exec调用的那个程序了。

popen函数

FILE popen(const char command , const char* mode)
比system的好处:可以获取运行的输出结果

调用popen,去执行PS,PS执行的结果会流到popen开辟的管道(fp)中, 用fread去读
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/172443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在XXX中找到了XXX的副本,但是当前代码与XXX中内置的版本不同【几种解决方案】

Microsoft VS警告类似如图所示&#xff1a; 然后发现编译编写好的代码无法打断点。定义的变量无法获取。 方案一&#xff1a; 把提示的该文件备份在其他文件夹一份&#xff0c;然后在项目中删除该文件。再把备份的文件放到该项目中。然后再编译。 方案二&#xff08;参考该博客…

Udev设备管理器

udev 引入 在2.4内核中 引入了 devfs&#xff0c;他支持设备节点的动态创建。devfs提供了在内存中的文件系统中创建设备节点的能力。设备驱动程序能够自主的管理自己的设备文件。而命名节点的任务还是落到了设备驱动程序头上。但是&#xff0c;设备命名策略是可管理的&#xf…

【设计模式】结构型模式·适配器模式

学习汇总入口【23种设计模式】学习汇总(数万字讲解体系思维导图) 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01; 一. 概述 将一个类的接口转换成客户希望的另外一个接口&#xff0c;使得原本接口不兼容而不能一…

分布式搜索引擎--Elasticsearch

1.1 相关术语 和mysql类比 索引&#xff1a;数据库&#xff0c;database&#xff0c;6.0以后变化&#xff0c;对应表 类型&#xff1a;table&#xff0c;6.0以后变化&#xff0c;废弃 文档&#xff1a;一张表里的一行 字段&#xff1a;一个属性就是一个字段 和分布式相关 集群…

NLP学习笔记(六) Transformer简明介绍

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲 Transformer\text{Transformer}Transformer&#xff0c;想要获取更多相关文章&#xff0c;欢迎关注 自然语言处理 专栏 在之前的两篇文章中&#xff0c;我们介绍过序列到序列模型以及注意力机制在序列到序列模型中的应用 …

Linux开启Docker远程访问并设置安全访问(证书密钥),附一份小白一键设置脚本哦!

前言 喜欢折腾慢慢看&#xff0c;不喜欢折腾直接跳到小简下文的一键脚本那里&#xff0c;两分钟搞好。 我的博客&#xff1a;https://blog.ideaopen.cn 我的公众号&#xff1a;小简聊开发 开启远程访问 编辑docker.service文件 vi /usr/lib/systemd/system/docker.service # …

Python FastAPI 框架 操作Mysql数据库 增删改查

2 比 1 更容易理解&#xff0c;可以先看2&#xff08;单文件级别&#xff09; 1、FastAPI 框架 操作Mysql数据库(项目多文件级别) FastAPI 可以使用任何您想要的关系型数据库。 在这里&#xff0c;让我们看一个使用着SQLAlchemy的示例。 您可以很容易地将SQLAlchemy支持任何…

每天进步一点点,今天来学结构体

什么是结构体&#xff1f; C 语言允许用户自己指定这样一种数据结构&#xff0c;它由不同类型的数据组合成一个整体&#xff0c;以便引用&#xff0c;这些组合在一个整体中的数据是互相联系的&#xff0c;这样的数据结构称为结构体&#xff0c;它相当于其它高级语言中记录。 …

01、数据结构——数组

一、数据结构与算法 数据结构是一门研究组织数据方式的学科&#xff0c;有了编程语言也就有了数据结构。学好数据结构可以编写出更加漂亮、更加有效率的代码。程序数据结构算法数据结构是算法的基础 二、稀疏数组&#xff1a; 1、基本介绍&#xff1a; 当一个数组中大部分元…

【Javascript】文本转语音SpeechSynthesisUtterance

SpeechSynthesisUtterance基本介绍 SpeechSynthesisUtterance是HTML5中新增的API,用于将指定文字合成为对应的语音.也包含一些配置项,指定如何去阅读(语言,音量,音调)等 SpeechSynthesisUtterance基本属性 SpeechSynthesisUtterance.lang 获取并设置话语的语言 SpeechSynthesis…

InfluxDB 笔记

概念 Measurement 类似于表名。 A measurement acts as a container for tags, fields, and timestamps. Tag 补充描述数据的信息&#xff0c;如示例中的location和scientist描述了该数据的采集地和采集人。这两个称为Tag Key&#xff0c;具体的值则称为Tag Value&#xff0c…

小程序基础篇-视图与逻辑

本次学习目标&#xff1a;实现页面间的导航跳转实现下拉刷新实现上拉加载更多知道小程序常用的生命周期函数1.页面导航页面导航指的是页面之前相互的跳转浏览器之间的页面导航有两种&#xff1a;<a>;location.href小程序之间的页面导航有两种&#xff1a;声明式导航&…

告警与恢复告警原理及实现

一、 背景自“双碳”政策提出以来&#xff0c;KaiwuDB 聚焦“数字能源”领域&#xff0c;为用户打造数字能源管理平台&#xff0c;旨在提升综合能源和碳资产管理能力。数字能源管理平台是以 KaiwuDB 为核心建设的云-边-端一体化数据服务平台&#xff0c;致力于为 IoT、工业互联…

前言技术--swagger

目录一、前后端分离的特点二、在没有swagger之前三、swagger的作用四、swagger的优点五、集成swagger5.1 新建springboot项目5.2 集成swagger5.3 开发一个controller用于测试5.4 启动服务&#xff0c;验证集成效果六、swagger常用注解七、swagger使用综合案例一、前后端分离的特…

Python的PyQt框架的使用-常用控件篇

Python的PyQt框架的使用-常用控件篇一、前言二 、QLineEdit 文本框三 、QPushButton按钮控件四、QRadioButton 单选按钮一、前言 个人主页: ζ小菜鸡大家好我是ζ小菜鸡&#xff0c;小伙伴们&#xff0c;让我们一起来学习Python的PyQt框架的常用控件。如果文章对你有帮助、欢迎…

第一个程序——构建一个ServerUI

简介 本次程序设计均使用python实现&#xff0c;使用sql server对聊天室用户的数据进行存储。通过python socket套接字编程&#xff0c;实现了在线聊天室的功能&#xff0c;并使用python tkinter进行UI界面的设计。 思路 由计算机网络的基础知识易知&#xff0c;两个主机之间…

基于LSTMGRU的微博突发事件分析与谣言检测(附完整的代码+报告)

问题描述及方法基础 本章主要对课题研究所涉及的机器学习、自然语言处理的原理和方法进行介绍,主要分为四部分,第一部分是将本课谣言检测任务的符号化描述;第二部分是微博数据的预处理,包括语言模型、文本分词等技术;第三部分与第四部分分别是本文搭建的微博谣言检测模型所…

py字符串的格式化笔记

print():和cjava差不多&#xff0c;只是逗号变了&#xff0c;其中 %s 就是模板中的占位符&#xff0c;表示这个位置先占着&#xff0c;待会儿要有数据填入到这里。然后再提供一个元组&#xff0c;里面依次存放需要填入到 %s 位置 的数据。这里是使用变量 (salary,tax,aftertax)…

CSS.前端基础.html

什么是 CSS? CSS 指层叠样式表 (Cascading Style Sheets)样式定义如何显示 HTML 元素样式通常存储在样式表中把样式添加到 HTML 4.0 中&#xff0c;是为了解决内容与表现分离的问题外部样式表可以极大提高工作效率外部样式表通常存储在 CSS 文件中多个样式定义可层叠为一个示…

丝绸之路也可以是科技传播之路

唐宋元海外贸易 618年-1368年 王孝通 生卒年代不详 孙思邈541年—682年 一行 公元683年-公元727年 李淳风 602年&#xff0d;670年 沈括 1031年&#xff0d;1095年 郭守敬 1231年&#xff0d;1316年 扎马鲁丁生卒年代不详 阿拉伯帝国 632年-1258年 阿尔花拉子模 780年&#xf…