首页 > 系统相关 >linux:进程控制

linux:进程控制

时间:2024-06-02 16:46:28浏览次数:19  
标签:控制 调用 退出 exit linux 进程 返回值 参数

  之前在晋城地址空间中有提到fork函数,可以创建一个子进程,但是它却有两个返回值附进程,返回子进程的进程号,PID子进程则返回零,那如何理解这一过程?一个函数返回两个返回值呢?

 可以看到帮助文档中显示有两个返回值.

   Fork函数是一个系统调用,其中包括如下几个步骤,有创建子进程的PCB进程控制块,初始化进程PCB控制块,创建子进程新的地址空间,在初始化子进程的地址空间,创建页表的映射再将pcb进程控制块加入CPU的运行列表中,再当fork返回值进行写回时,他们虽然是同一个变量,但是会发生写时拷贝,因此同一个变量会有两个不同的值.

  在C语言当一个程序是从main函数开始运行的,main函数也有一个return返回值,这个返回值在操作系统中看来是一个进程的退出码,表示用来得到一个进程运行完成后的处理结果如何当有个c语言程序执行完成后如果这个c语言的return值返回的是零则使用问号变量来查看上一个程序执行的返回值就会发现问号变量的返回值也是零所以在linux命令行,中问号变量中保存了上一个可执行程序的最终返回值信息.

  如下当输入未知指令时错误码为127,当ls指令成功执行时错误码为0,表示没有错误.

 可以用C语言来打印linux中所有的错误码:

 

   进程退出:当一个进程退出时,有三种情况,第一种情况表示正确退出,第二种情况表示错误退出,第三种情况表示进程异常终止,而进程的退出码则只有在错误退出时才会有可控的参考作用,C语言中一个进程,从main函数中返回的返回值表示,进程结束还有一种是用exit函数来退出,并且设置退出码需要特别注意。当调用了exit退出时,进程会直接退出,无论这个exit写在哪里,此外,还有一种,_exit,函数也用于退出,只不过_exit系统调用,而exit则是C语言封装的_exit,C语言封装的exit退出函数,包含了在进程退出时同时刷新缓冲区的作用.

 如上图_exit中处于man帮助第二页的系统调用,

 如上图使c库函数的封装.

  进城等待:之前有提到过一个僵尸进程,在没有被回收是会占用系统资源的,因为他的PCB进程块一直存在于操作系统中,等待父进程的回收,一般来说,父进程如果没有特定的操作,他会默认的回收僵尸状态的子进程,但并不会返回子进程的退出状态,而系统调用waitpid可以让父进程等待回收子进程,并且返回值为子进程的PID,具体需要传入三个参数,第一个参数为需要回收的子进程的PID,第二个参数为一个输出型参数,他会将错误码设置,第三个参数为等待方式,可以设置为阻塞等待或非阻塞等待.

  特殊的是第二个参数,它是一个输出型参数,而这个参数是一个位图结构,它共有32位。当进程退出状态被置位后,从低到高8到15位是进程正常退出后的退出码,而0到7位表示信号终止的退出码,第八位则为core dump标志位,我们首先可以使用按位与的运算来得到第二个参数的进程退出状态,也可以使用系统中提供的WIFEXITED函数来直接判断进程的退出状态,waitpid系统调用中的第三个参数,如果设置为零,则是阻塞等待的方式来回收紫子进程。如果是系统中封装的wonhange表示非阻塞等待的方式来回收子进程的错误信息,非阻塞的等待方式的优点是可以让父进程有时间去干别的任务,定期轮巡的来检测被等待的子进程.

  进程替换:父进程可以使用fork创建一个子进程来执行他们后面共同的代码,但也其实可以创建一个新的子进程来让这个子进程执行全新的程序,这个叫linux中的进程替换,这也是使用到了系统调用来达到进程替换的目的,使用exec系统调用可以执行磁盘中的一个文件,第一个参数表示程序的存放路径,第二个表示执行命令,然后可变参数可以选择程序执行的选项,最后,需要用到null来结尾,进程替换的本质是将进程地址空间中的物理内存地址替换为新的可执行程序的物理内存数据,进程pid不变也没有新建新的子进程.

  进程替换只有一个系统调用,但是C语言库中对这个系统调用进行了多个封装,可以按需求的去调用不同的c接口来实现进程替换的目的,例如有execlp ,execv, execvp等这些c库函数,因此,我们可以理解为一个解释器的shell的一个简单的原理,就是在一个死循环中不断的使用子进程调用进程替换来不断的执行新的进程,在linux中,每个进程都有自己的工作目录,而我们使用CD命令则是切换解释器进程的工作目录使解释器进程本身在指定目录下工作,因此CD命令并没有创建新子进程来,而是使用了chdir来切换解释器的工作目录,这样的命令叫做解释器内键命令,echo也是同样的原理.

如下是c库函数封装的进程替换和接口,

 

标签:控制,调用,退出,exit,linux,进程,返回值,参数
From: https://www.cnblogs.com/qjwxlj/p/18227264

相关文章

  • linux:进程地址空间
    在之前使用C语言中,我们知道使用malloc函数可以开辟一块堆空间,然后这块堆空间如果不用的话是需要释放的,然后一般的变量是放在栈区上面的,还有一些静态区,代码段是存放静态变量和代码的,这些空间可以说是内存,但他又不是真正意义上的物理内存,我们可以做一个实验,我们可以使用fork......
  • linux:环境变量
    说到环境变量,相信这个词不是第一次听到了,在WINDOWS中可能在安装JAVA的过程中也会遇到有配置系统环境变量的相关操作我们知道在一个操作系统中存在着大量的数据信息,但是我们可以在命令行中输入一条命令,能准确的从计算机中的某个位置找到,并且执行对应命令的进程,计算机的命令行为什么......
  • 【Linux】System V 共享内存
    一、共享内存1.1共享内存的原理:       两个进程,操作系统在内存空间中创建一个共享内存。在之前学习库的时候,有一个共享库的概念。我们可以按照其概念来了解共享内存的概念:将共享内存映射到页表中,和进程的地址空间建立联系。我们可以将共享内存的虚拟地址交给用户。两......
  • linux:进程状态
    往往计算机的cpu只有一个,一个cpu有多个核心,一个cpu在同一时间只能被一个进程占用,又因为计算机的cpu数量总是少于进程数的,因此cpu是通过时钟轮片的方式处理每个进程的任务, 这些进程并不是凌乱的放在操作系统中的,他们是被一个数据结构有组织,有规律的管理起来的,所以一个进......
  • Linux目录的基本结构(RHEL8系统基本使用之文件操作)
    1.Linux的目录树结构2.各目录的功能介绍3.理解文件路径表示方法Who?——>当前登录的用户Where?——>路径我要在哪儿创建文件?我要删除什么地方的什么文件?我所要查看的文件在哪里?What?——>操作命令How?——>理清思路,找到方法,做就对了绝对路径1.一定是以"/"(根)开......
  • SSH远程连接Linux服务器
    1.1SSH(SecureShell)是一种网络协议,用于加密方式远程登录到服务器。以下是通过SSH连接Linux服务器的基本步骤:安装SSH客户端:Windows10及以上版本自带了OpenSSH客户端安装SSH服务端:在服务器端安装OpenSSH,需要在服务器终端进行。#安装sshsudoaptinstallopenssh-server......
  • 在Linux中,如何进行集群管理?
    在Linux中,进行集群管理涉及到多个步骤和考虑因素。以下是一个详细的指南,帮助你理解并执行Linux集群管理:一、理解集群管理的基本概念集群定义:集群是一组相互独立的、通过高速网络互联的计算机,它们构成一个组并以单一系统的模式加以管理。集群技术可以在较低成本下提供高性能、可......
  • 在Linux中,如何进行系统性能瓶颈分析?
    在Linux中进行系统性能瓶颈分析是一个系统性的过程,涉及多个方面。以下是一个详细的步骤说明,用于分析和诊断Linux系统性能瓶颈:1.确定性能指标CPU利用率:检查CPU是否成为瓶颈。可以使用top、htop等工具查看CPU的使用情况,包括用户态、内核态和空闲态的占比。内存使用:检查内存是否......
  • 在Linux中,如何进行系统故障恢复?
    在Linux系统中进行故障恢复是一个涉及诊断问题、制定恢复计划并执行恢复步骤的过程。以下是一些基本步骤和策略,帮助您应对不同类型的系统故障:1.初步诊断与隔离识别症状:首先,观察并记录故障的具体表现,比如系统无法启动、服务异常、性能下降等。查看系统日志:使用dmesg命令查看内......
  • 在Linux中,如何进行高可用性配置?
    在Linux环境中实现高可用性(HighAvailability,HA)通常涉及多个层面的策略和技术,以确保系统、服务或应用在面对硬件故障、软件错误或维护操作时能够持续运行。以下是构建Linux高可用性环境的一些关键步骤和组件:1.理解高可用性概念目标:最小化停机时间,提高系统或服务的可用性。......