linux 进程重要知识(详讲)

linux进程的一切知识.zip linux进程的一切知识.zip 进程占用的内存空间布局,虚拟空间地址分布 进程启动的3种方式 监控子进程的状态 进程的终止 僵尸进程 立即下载

一、进程基础

1.进程相关概念

  •   进程是一个独立可调度的任务,进程是一个抽象的实体,当系统在执行某个程序时,分    配和释放的各种的资源

  •   进程是一个程序的一次执行的过程

  •   进程是程序执行资源管理的最小单位

  •   进程和程序的区别:进程是动态的概念,它是程序执行的过程,包括创建、调度和消亡

                                   程序是静态的,它是一些保存在磁盘上的指令的有序集合,没有                                       任何执行的概念

                                                 正文段(.test)

                                进程         用户数据段(.data)     程序

                                                系统数据段 

         进程不仅包括程序的指令和数据,而且包括程序计数器值,CPU的所有寄存器以及存储临时数据的进程堆栈

2.linux下的进程结构

    主要的进程标识:进程号(Process Identity Number , PID)

                                父进程号(Parent Process ID,  PPID)

   Linux中的进程包含三个段:

  • 数据段:存放的是全局变量、常量以及动态数据分配的数据空间(如malloc函数取得的空间)等

  • 正文段:存放的是程序中的代码

  • 堆栈段:存放的是函数的返回地址、函数的参数以及程序中的局部变量

3.linux系统的进程类型

  • 交互进程:该进程是由shell控制和运行的。交互进程既可以在前台使用,也可以在后台使用

  • 批处理进程:该进程不属于某个终端,它被提交到一个队列中以便顺序执行

  • 守护进程:该类进程实在后台运行,它一般在linux启动时开始执行,系统关闭时才结束。

4.进程运行状态

  • 运行态(R):此时进程正在运行或者正在准备运行

  • 等待态:此时进程正在等待某一个事件的发生或者某种系统资源(阻塞,休眠,等待,睡眠态)           

              可中断态(S):接收到信号有反应          

              不可中断态(D):接收到信号没有反应

  • 停止态(T):此时进程已经被终止(SIGSTOP信号,SIGCONT信号)

  • 死亡态(Z):这是一个已终止的进程,但还在进程向量数组汇总占有一个task_struct结构体(僵尸态)

进程状态图:

                              

5.进程的模式

  进程的执行模式分为用户模式和内核模式

在系统中,有一个定时器,每隔1ms产生一次中断,中断会进入内核(成为心跳,滴答tick);在用户模式与内核模式切换时,只有发生中断,才能从用户模式进入到内核模式,系统调用都是靠软件进行中断,

6.调度进程

  • ps          查看系统中的进程

  • top        动态显示系统中的进程

  • nice      按用户指定的优先级运行进程

  • renice   改变正在运行的进程的优先级

  • kill         结束进程(包括后台进程)

  • bg          将挂起的进程在后台运行

  • fg           把后台的运行的进程放到前台运行

二、进程系统调用

1.进程创建:fock() 产生一个进程

       头文件:#include<sys/types.h>//提供类型pid_t的定义   #include <unistd.h>

      函数原型:pid_t fock(void);

      函数返回值:0:子进程,从fock返回的地方开始执行

                            子进程PID(大于零的证书):父进程

                            -1:出错

      getpid():获取pid号,子进程号

      getppid():获取ppid号,父进程号

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。(系统启动首先要运行init进程,init扫描孤儿进程,收养孤儿进程)

僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程,通常是由父进程清理子进程的僵尸。

2.exec函数族(替换一个进程的映像)

 fock函数用于创建一个进程,该子进程几乎拷贝了父进程的全部内容

 exec函数族提供了一种在进程中启动另一个程序执行的方法。它可以根据指定的文件名或者目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段、堆栈段。在执行完之后,原调用进程的内容除了进程号外,其他全部都被替换了。

什么时候使用?

 当进程认为自己不能在为系统和用户做出任何贡献了时就可以调用exec函数,让自己执行新的程序。如果某个进程想同时执行另一个程序,它就可以调用fock函数创建子进程,然后在子进程中调用任何一个exec函数。这样看起来就好像通过执行应用程序而产生了一个新进程一样。

      #include <unistd.h>

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

  •  int execlp(const char *file, const char *arg, .../* (char  *) NULL */);

  •  int execle(const char *path, const char *arg, ... /*, (char *) NULL, char * const                                                                     envp[] */);

  •  int execv(const char *path, char *const argv[]);

  •  int execvp(const char *file, char *const argv[]);

  •  int execvpe(const char *file, char *const argv[],char *const envp[]);

exec函数组使用区别:

  • 可执行文件查找方式

  • 参数表传递方式

  • 环境变量的使用

exec函数族使用注意点:

在使用exec函数族时,一定要加上错误判断语句

常见的错误原因有:

  • 找不到文件或者路径,此时errno被设置为ENOENT

  • 数组argy和envp忘记用NULL结束,此时errno被设置为EFAULT

  • 没有对应可执行的的运行权限,此时ERRNO被设置EACESS

3.exit 和 _exit

头文件: exit:#include<stdlib.h> 

               _exit: #include <unistd.h>

函数原型: exit:  void exit(int status);

               _exit:void  _exit(int status);

函数传入值:status是一个证书的参数,可以利用这个参数传递进程结束时的状态,通常()表示正常结束;其他的数值表示出现了错误,进程非正常结束。在实际编程时,可以用wait系统调用接受子进程的返回值,进程相应的处理

_exit和exit的区别:

  • _exit()函数的作用最为简单:直接使进程终止结运行,清除其使用的内存空间,并销毁其在内核中的数据结构

  • exit()函数则在这些基础上做了一些包装,在执行退出之前加了若干道工序

  • exit()函数在调用exit系统调用之前要文件的打开情况,把文件缓冲区中的内容写入文件,就是图中的“清理I/O缓冲”一项

                           

4.wait 和 waitpid

  • wait函数:调用该函数使进程阻塞,直到任一个子进程结束或者是该进程接受到了一个信号为止(等待态,可中断)。如果该进程没有子进程或者其子进程已经结束,wait函数会立即返回。

  • waitpid函数:功能和wait函数类似。不同的是可以指定某一子进程结束以及等待的方式(阻塞或非阻塞)

wait()函数

头文件  #include<sys/types.h>

             #include <sys/wait.h>

函数原型:   pid_t wait(int *status);

函数参数:   status是一个整形指针,指向的对象用来保存子进程退出时的状态。

  •                      status若为空,表示忽略子进程退出时的状态

  •                      status若不为空,表示保存子进程退出时的状态

  •                       另外,子进程的结束状态可由linux中一些特定的宏来测定

waitpid()函数

头文件  #include<sys/types.h>

             #include <sys/wait.h>

函数原型:pid_t waitpid(pid_t pid, int *status, int options)

函数参数:pid

  • pid>0:只等待进程ID等于pid的子进程,不管已经有其他子进程运行结                                   束退出了,只要指定的子进程还没 有结束,waitpid就会一直等下去

  • pid =1: 等待任何一个子进程退出,此时和wait作用一样

  •  pid =0:等待其他组ID等于调用进程的组ID的任一子进程

  •  pid<0:  等待七组ID等于pid的绝对值的任一进程

  status:获取子进程结束信息

 options:

  • WNOHOG,若由pid指定的子进程并不立即只使用,到waitpid不阻塞,此时返回值为0

  •  WUNTRACED:若某实现支持作业控制,则由pid指定的任一子进程已暂停,且其状态自暂停以来还来报告过,则返回其状态

  •   0:同wait,苏泽父进程,等待子进程退出

函数返回值:正常:结束的子进程的进程号

                     使用选项WNOHANG且没有子进程结束时:0

                     调用出错:-1

   5.linux守护进程

  • 守护进程,也就是通常所说的Daemon进程,是linux中的后台服务进程,它是一个生存期较长的进程,通常独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件

  • 守护进程常常在系统启动时开始运行,在系统关闭时终止

  • linux系统有很多守护进程,大多数服务都是用守护进程实现的          

  • 在linux中,每一个系统与用户进行交流的界面称为终端。从该终端开始运行的进程都会依附于这个终端,这个终端称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会被自动关闭。

  • 守护进程能够突破这种限制,他从开始运行,直到整个系统关闭才会退出。如果让某个进程不会因为用户或者终端的变化而受到影响,就必须把这个进程变成一个守护进程。

6.linux守护进程编写步骤

(1) 创建子进程,父进程退出

 第一步需要子进程在形式上做到与控制终端的脱离,由于父进程已经先于子进程退出, 子进程编程孤儿进程

pid=fork();
if(pid>0)
{
    exit(0);
}

(2)在子进程中创建新会话

进程组是一个或多个进程的集合。进程组由进程组ID来唯一表示,每个进程组都有一个组长进程,进程组ID就是组长进程的进程号;

会话期是一个或多个进程组的集合

setsid();

(3)改变当前目录为根目录

通常的做法是让“/”或“/tmp”作为守护进程的当前工作目录

在进程运行过程中,当前目录所在的文件系统时不能卸载的

chdir函数可以改变进程当前工作目录

chdir("/");

(4)重设文件权限掩码

文件权限掩码是指文件权限中被屏蔽掉的对应位把文件权限掩码设置为0,可以增加该守护进程的灵活性。

umask(0);

(5)关闭文件描述符

新建的子进程会从父进程那里继承所有已经打开的文件,在创建新的会话后,该守护进程已经脱离任何控制终端,应当关闭用不到的文件。(一般情况下只需要关闭系统自带的三个文件描述符就行),如果在这里需要打印调试,“先不脱离,关闭”。

close(0);
close(1);
close(2);

                        

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Qt C++ 信号发生器控制软件 waveformComboBox->addItems({"正弦波", "方波", "三角波", "锯齿波", "脉冲波"});frequencyLabel = new QLabel("频率 (Hz):");amplitudeLabel = new QLabel("幅值 (V):");offsetLabel = new QLabel("直流偏移 (V):");} else if (currentWaveform == "三角波") {} else if (currentWaveform == "方波") { 阅读详情

相关推荐

C语言—for循环打印矩形,正三角形,倒三角形,九九乘法,等腰三角形,倒着的等腰三角形(简易版代码)(重点考察for循环嵌套)

本章节教大家如何利用for循环打印正三角形,倒三角形,九九乘法表及等腰三角形(简易版代码)说明:1、循环语句的循环体内又包含另一个完整的循环结构,称为循环结构的嵌套。内嵌的循环语句中还可以再嵌套循环结构,这样就形成多重循环结构的嵌套。2、for 语句、while 语句和 do-while 语句都允许嵌套。三种循环语句可以相互嵌套。3、内层的循环语句必须完全被包含在外层的循环体中,不能发生交叉。

m0_63501145的博客 1695

【Linux】Linux进程基础

进程的本质是在计算机内存中运⾏的程序,但是这⼀个概念太过于⼴泛每个应用程序运行于现代操作系统之上时,操作系统会提供一种抽象,好像系统上只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一。

2301_79582015的博客 1248

保姆级教程:用STM32CubeMX配置GD32的CAN总线(含异常处理)

本文提供了一份详细的STM32CubeMX配置GD32 CAN总线开发指南,涵盖从HAL库移植到异常处理的全过程。重点解析GD32与STM32在CAN总线初始化、报文发送优先级处理等方面的关键差异,并提供优化代码维护与版本控制的实用策略,帮助开发者高效完成项目迁移。

onion的博客 829

Linux进程基础

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!   计算机实际上可以做的事情实质上非常简单,比如计算两个数的和,再比如在内存中寻找到某个地址等等。这些最基础的计算机动作被称为指令 (instruction)。所谓的程序(program),就是这样一系列指令的所构成的集合。通过程序,我们可以让计算机完成复杂的操作。程序大多数时...

weixin_33750452的博客 213

普通人如何上岸华为OD-面试总结

总共有3道算法题,100分值的两道,200分值的一道,不同的毕业院校和专业,通过机试的分值不一样,最少需要150分通过,提前和hr联系,了解自己需要多少分通过。重中之重:哪怕你是背的题库,也请你一定不要直接抄原来的,最好是变更下方法名,否则会判定你重复率过高,从而失去后面的面试机会(实在是不会做再用此方法,凑分数所用,面试官能看到你的代码,会影响你的面试评价)本人女,所以还问道了婚育计划,有对象这点可以说,没有问题,但是如果可以的话,生孩子的时间,可以给hr说这几年不考虑。如果说没有难题,直接就挂了。

weixin_47767264的博客 5452

知识推理——TransE(知识表示、知识嵌入)

知识图谱嵌入/表示方法 TransE

missyoudaisy的博客 1831

Linux进程,信号,IPC等知识普及强文,最后讲了下gprof用法(转)

Linux进程,信号,IPC等知识普及强文,最后讲了下gprof用法(转) 来源: ChinaUnix博客  日期: 2008.03.14 15:48 (共有条评论) 我要评论 感谢007xiong,Hoyt等,这篇文章挺好的,担心哪天原来的链接没

YEYUANGEN的专栏 2488

强化学习入门8—深入理解DDPG

本文是强化学习入门系列的第八篇,前面我们讲Actor-Critic时提到了DDPG。DDPG是google DeepMind团队提出的一种用于输出确定性动作的算法,它解决了Actor-Critic 神经网络每次参数更新前后都存在相关性,导致神经网络只能片面的看待问题这一缺点。同时也解决了DQN不能用于连续性动作的缺点。

小菜羊的博客 4314

Linux进程概念1

下一篇还是接着这个讲,从CPU的调度算法开始讲。

ck的博客 771

生成式引擎优化(GEO)全景指南:技术架构、实施策略与未来趋势

生成式引擎优化(GEO)全景指南摘要 GEO(生成式引擎优化)是针对AI生成内容(如ChatGPT、文心一言等)的优化策略,通过结构化数据、权威建设与语义优化提升企业内容在AI答案中的引用优先级,实现“无点击曝光”。其核心价值在于从流量竞争转向信任构建,突破传统SEO局限。技术架构依托RAG(检索增强生成)、向量数据库及反馈学习机制,动态优化内容生成与引用逻辑。实施策略包括:部署结构化数据(如JSON-LD)、维护动态知识图谱、适配多模态内容(3D/VR)、联合权威机构发布白皮书。行业案例显示,美妆、智能家

解锁AI流量新红利!🚀 GEO优化(生成引擎优化)助您掌控AI搜索,让AI成为您的品牌最佳代言人! 1451

Project 编制进度计划【项目管理】

Project 项目管理编制进度计划详解。

m0_52861684的博客 5087

【Linux】进程等待--详讲

21世纪最棒的 进程等待--详讲 文章

2301_80349538的博客 2363

VsCode安装和配置c/c++环境(超完整,小白专用)

1. vsCode配置C/C++环境 1. vsCode下载和安装 1. 下载Microsoft vsCode [vsCode在这里插入图片描述官网下载: https://code.visualstudio.com/ 2. 安装vsCode 3. 下载中文插件 我这边已经下载过,刚卸载但是没有重启编译器,所以界面显示了中文 2. MinGW编译器下载和配置 1. 下载MinGW 在线安装——下载MinGW-W64-install.exe(速度慢) 下载压缩包——×86_64-posix-

黄化的多多 60万+

Linux进程概念(详讲)

本文详细介绍了Linux操作系统中的进程管理机制,包括进程控制块(PCB)、进程状态、进程优先级、环境变量、进程地址空间以及进程调度队列等核心概念。首先,进程通过PCB(在Linux中为task_struct)进行描述和管理,PCB包含了进程的标识符、状态、优先级等信息。进程状态包括运行、睡眠、暂停、僵尸等,每种状态反映了进程的不同生命周期阶段。进程优先级决定了进程获取CPU资源的顺序,可以通过nice值进行调整。环境变量如PATH、HOME等,用于指定系统运行环境参数。进程地址空间是虚拟地址到物理地址的映

weixin_47271425的博客 1903

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

详讲Linux下进程等待

大强想知道小强啥时候把任务完成,就用了个办法:他跟小强说,等你干完活,记得跟我说一声。然后大强就不做别的事了(从运行状态变成阻塞状态 )在那等着小强的消息,把 CPU 让给其他小伙伴(其他就绪进程 )去用。小强呢,就跑去收集石头了。等他把石头收集完(子进程完成任务并终止 ),就赶紧给大强发个信号,说 “我干完啦”。大强收到这个信号后,就从等着的状态(阻塞状态 )醒过来(变成就绪状态 ),然后就又可以让大强接着做他后面的事啦,比如看看小强收集的石头合不合格(处理子进程的终止状态 )。

LJY_CF的博客 1697

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【Linux】进程通信--详讲

本文主要介绍了进程间通信(IPC)的两种管道机制:匿名管道和命名管道

2301_80349538的博客 2942

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【Linux】进程的详讲(中上)---父子进程PID

Linux进程------第二弹来啦!!!

2301_80349538的博客 2401

【Linux】进程的详讲(中下)---进程的状态

Linux进程详细讲解,配图

2301_80349538的博客 1599

【Linux】进程的详讲(上)

【Linux】进程详讲(上部分),下一部进程作品下周一(2025.3.31)更新

2301_80349538的博客 1713

【Linux】进程的详讲(下)--进程的环境变量

LInux ---- 优先级&&环境变量 ---- 详细讲解

2301_80349538的博客 1836

Linux进程基本知识详解

哈喽,小伙伴们大家好,进程是操作系统中非常重要的一个概念,今天我将在linux系统下带大家了解进程的一些基本知识。事不宜迟,拿好小本本,我们赶紧开始吧~

weixin_59371851的博客 6130

Linux 进程知识总结

Linux 进程知识总结

不迁怒,不贰过。小知识,大智慧。 1651

linux 进程详祥祥解

程序是指令、数据及其组织形式的描述,进程是程序的实体,进程是系统进行资源分配和调度的基本单位。每个进程都有自己的独立虚拟地址空间,进程与进程、进程与内核互不干扰,一个进程不能读取或修改另一个进程或内核的内存数据,因为它们映射的物理空间不同。进程号为1(init)的进程是所有其它进程的父进程。前台进程:该进程由终端运行并控制,终端与进程间可以进行实时交互,例如信息输入等;后台进程:该进程没有与终端交互,例如执行运行指令后面添加“&”,该进程就会在后台运行;ctrl + z也会让进程暂停为后台进程。

Qurry的博客 1294

【linux】进程控制——进程创建,进程退出,进程等待

一个进程创建了另一个进程,创建者为父进程,被创建者为子进程。父进程可以创建多个子进程。操作系统是一号进程,所有进程构成一颗多叉树结构。每个父进程只对直系的子进程负责。父进程创建子进程的一整套流程为:创建子进程——>子进程完成任务——>父进程回收子进程父进程先退,子进程未退。此时子进程的父亲进程被改为1号进程(操作系统),那么该子进程被称为孤儿进程父进程未退,子进程先退。但父进程没有读取到子进程的退出(进程等待),该子进程的状态被改为 Z 状态,Z 状态的进程被成为僵尸进程。

2301_79796701的博客 2708
上一篇: win10快捷键(常用快捷键)
下一篇: linux下线程与进程的区别
JIANXIN.Y
博客等级 码龄9年 273粉丝 42原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值