首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

是否可以留在由进程使用execl打开的shell中,就在名为_exit的进程之前?

在由进程使用execl打开的shell中,是不可以留在名为_exit的进程之前的。当使用execl函数执行一个新的程序时,当前进程的内存空间会被新程序的代码和数据替换,这意味着原来的进程已经被完全替换掉了。因此,在新程序执行完毕之前,原来的进程已经不存在了,也就无法留在新程序执行之后。

_exit是一个系统调用函数,用于终止当前进程并返回一个退出状态码。当进程调用_exit函数时,它会立即终止并释放所有相关资源,包括打开的文件、分配的内存等。因此,在_exit函数被调用之后,进程已经终止,无法再执行其他操作。

如果需要在新程序执行完毕后继续执行其他操作,可以考虑使用其他的进程控制函数,如forkexec组合使用,或者使用多线程来实现并发执行。这样可以在新程序执行完毕后,继续在原进程中执行其他操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Linux修炼】11.进程创建、终止、等待、程序替换

fork返回,开始调度器调度 对于第三点添加系统进程列表,我们在之前进程章节中介绍是链表存储,而实际上当时是为了便于理解,操作系统实际上没有那么笨,其实际上是哈希表存储,通过struct...即前两条都意味着子进程退出信号和退出结果都保留在进程PCB。...,这就是进程程序替换) 4.1 见见猪跑 在这一小节,包含6种函数,为了提前演示,就在这里拿出一个函数看看进程程序替换究竟是什么样子。...在上面实现shell模拟代码,我们fork出了子进程,子进程有自己工作目录,因此cd更改是子进程工作目录,子进程执行完毕,继续用是父进程,就是我们shell,因此在这个过程进程也就是shell...将编写模拟shell进行修改——修改当前路径 这样就补充了之前不足。像cd这种不需要让我们进程来执行,而是让shell自己执行命令,被称为内建/内置命令。

6.2K00

Linux笔记(10)| 进程概述

WIFEXITED:宏用来判断子进程是否正常终止(return、exit、_exit退出),如果子进程正常退出,则该宏为真 WIFSIGNALED:宏用来判断子进程是否非正常终止(被信号所终止) WEXITSTATUS...如果进程调用了fork函数,那么父子进程同属一个进程组,父进程为首进程Shell通过管道执行连接起来应用程序,两个程序同属一个进程组,第一个程序为进程进程 进程组id:pgid,进程...前台进程进程会占用会话所关联终端来进行,shell启动其他应用程序时,其他程序成为首进程 后台进程组 后台进程程序是不会占用终端在shell进程里启动程序时,加上&符号可以指定程序运行在后台进程组里面...、桌面系统启动终端 3、虚拟终端:Linux内核自带,ctrl+alt+f6可以打开7个虚拟终端 守护进程 会话用来管理前后台进程组,会话一般关联着一个终端当终端被关闭了之后,会话所有进程都会被关掉...我们当前进程和syslogd进程本来是没有任何关系,但是我们当前进程可以通过调用openlog打开一个和syslogd相连接通道,然后通过syslog向syslogd发消息,然后由syslogd来将其写入到日志文件系统

67510
  • Linux:进程控制(二.详细讲解进程程序替换)

    文章目录 1.进程程序替换 1.1概念 1.2原理 1.3使用一个`exec` 系列函数 execl()函数 结论与细节 2.多进程程序替换 3.其他几个exec系列函数 也可以调用其他语言程序...那我们怎么样才能执行其他程序代码呢?(例如在程序里使用ls之类指令)就可以使用进程程序替换,一开始我们先只看单进程情况。...这个过程通常是操作系统提供 exec 系列函数来实现: 地址空间替换:进程地址空间是指进程可以访问内存范围。...同时,由于execl会替换整个进程映像,所以在调用execl之前,通常需要确保当前进程所有打开文件描述符、内存分配等都被适当地处理或释放,因为这些资源不会被新程序继承。...把数据从一个硬件搬到另一个硬件,只有操作系统能做 2.多进程程序替换 我们可以创建一个子进程进程来进行程序替换,父进程来等待结果就可以。为什么?

    18410

    Linux进程控制

    因为在到达return指令之前,子进程就已经被创建好了,并且有可能已经在OS运行队列当中,准备被调度,因此,此时对于fork函数这个return指令,不仅仅是被父进程使用,还会给子进程拿去使用。...二、进程终止: 在谈进程退出情况之前,我们先来聊聊退出码问题。 相信我们在写代码时候,特别是使用C/C++写代码时,我们都会写main函数,然后最后写一个return 0。...可以例子有:当我们在命令行写入:ls asdasdas,打开这样一个文件,但是我们没有这样文件,那么可以看到结果如下:  好了,在了解了退出码之和,我们可以谈谈进程退出情况了。...还有一个功能与exit函数类型,叫做_exit()。它们区别就在于,exit函数是库函数,而_exit属于系统调用,并且,exit()函数会刷新缓冲区,_exit并不会刷新缓冲区。...shell和python都是没问题。这里不演示了,演示例子无非就是将后缀改为cpp,并且使用C++语法,操作过程几乎差不多。

    2.4K30

    Linux进程控制

    Linux系统包括3种不同类型进程,每种进程都有自己特点和属性: 交互进程一个Shell启动进程,既可以在前台运行,又可以在后台运行 批处理进程:这种进程和终端没有联系,是一个进程序列 监控进程...exec函数族 Linux使用exec函数族来执行新程序,以新进程来完全代替原有的进程,exec函数族包含6个函数: #include int execl(const char...exit()在调用之前要检查文件打开情况,把文件缓冲区内容写回文件;_exit()则直接使进程停止,清除其使用内存空间,并销毁其在内核各种数据结构。...由于printf函数遇到’\n‘时才从缓冲区读取数据,在子进程,因为_exit(0)直接将缓冲区内容清除了,内容没有显示;而父进程,执行exit(0)之前会先将缓冲区内容显示出来。...等待一个指定进程任何子进程,其进程ID为pid绝对值 参数options提供一些额外选项来控制waitpid,包括WNOHANG和WUNTRACED两个选项,这是两个常数,可以用|运算符连接使用

    2K30

    【Linux】进程控制:理解什么是进程创建,进程终止,进程等待 | 进程替换

    进程是否是异常退出 没有异常;如果有,可以通过查看错误码来查看错误信息 可以通过查看退出码,来知晓进程退出情况  可以用以下命令查看最后一次进程退出退出码 echo $?  ...关闭所有打开流,所有的缓存数据均被写入  调用_exit 而 _exit 是直接退出进程,所以缓冲区绝对不在内核。 所以一般推荐使用 exit 函数来退出进程。  ...单进程进程替换 在理解什么是进程替换之前,我们先来看看进程替换怎么使用,下面是操作系统提供进程替换一些函数 这些函数如果调用成功则加载新程序从启动代码开始执行,不再返回。...对于像execl 和 execlp 有可变参数函数,其实它们使用方法很简单,从第二个参数开始,参数写法就很我们在命令行一样,且最后一个参数是NULL。...打印结果: 五.制作一个自己shell   有了以上这些知识后,我们就可以自己制作一个简易myshell了,使它也能像shell那么使用。 这里要特别注意环境变量维护!

    26710

    Linuxsystem函数返回值详解

    描述 system()库函数使用fork(2)创建一个子进程,该子进程使用execl(3)执行指定shell命令, execl("/bin/sh", “sh”, “-c”, command,...); 返回值 如果子进程无法创建,或者其状态不能被检索,则返回值为-1; 如果在子进程不能执行一个shell,或shell未正常结束,返回值被写入到status低8~15比特位;一般为127值...如果所有系统调用都成功, 将shell返回值填到status低8~15比特位 系统宏 系统中提供了两个宏WIFEXITED(status)、WEXITSTATUS(status)判断shell返回值..., 总结一下,system返回值需要通过以下三个步骤确定 首先判断子进程是否成功, status !...= -1; 判断子进程是否正常退出, WIFEXITED(status)是否非零; 子进程返回值, WEXITSTATUS(status) == 0 ; #include #include

    11.2K30

    linux系统编程之进程(三):exec系列函数和system函数

    当我们创建 了一个进程之后,通常将子进程替换成新进程映象,这可以用exec系列函数来进行。当然,exec系列函数也可以将当前进程替换掉。...exec名下是多个关联函数组成一个完整系列,头文件 原型      int execl(const char *path, const char *arg, ...);...根目录 umask 文件锁 进程信号屏蔽 未处理信号 资源限制 进程时间 而下面属性是发生变化: 文件描述符如果存在close-on-exec标记的话,那么打开文件描述符会被关闭。...= NULL; i++)         printf("%s\n", environ[i]);     return 0; } 其中environ是全局变量但没有在头文件声明,所以使用前需要外部声明一下...\n");     return 0; } 我们使用了exec系列函数进行举例进程映像替换,最后未被注释execle函数需要替换程序正是我们前面写输出系统环境变量小程序,但因为 execle

    2.2K60

    【Linux】进程程序替换

    让子进程执行父进程一部分代码 红框代码实际上是父进程代码,在没有执行fork之前代码就有了,在没有创建子进程之前,父进程代码加载到内存了,子进程被创建出来是没有独立代码,这个代码是父进程代码.../bin/ls 命令 实际上是一个可执行程序,所以ls程序是在磁盘上 ---- 前面执行是自己代码一部分,当调用execl时,将磁盘可执行程序替换当前进程代码和数据 后半部分就不执行自己代码了...没有,只是将新程序加载到当前进程代码段和数据段,用CPU去调度当前进程可以跑起来了 ---- 站在程序角度 程序被加载了内存,就可以称程序替换接口(execl) 为加载器 当创建进程时候,...自定义shell 编写极简版本shell(bash) 目标:为了深刻理解shell运行原理 ---- 输入 ps ajx |grep bash ,发现bash就是一个进程 ---- 由于shell...是一个进程,所以用while死循环 缓冲区问题 ---- 正常来说,运行可执行程序会显示命令行,但是由于没有\n刷新缓冲区,也没有使用相关刷新库函数,所以命令行会一直在缓冲区 直到 程序结束才显示

    2K30

    【操作系统】进程通信——管道

    进程管道:int fd[2] 使用文件描述符fd[1],向管道写数据。 使用文件描述符fd[0],从管道读数据。 注意: 单进程管道无实际用处,管道用于多进程间通信。...创建子进程。 在子进程使用execl()函数,将子进程替换为程序p2。(在使用execl函数时,把管道读端作为参数。) 在父进程,通过管道给子进程发送字符串。...可以标准输入(或标准输出)程序。 实现流程: 使用dup复制文件描述符。 用exec启动新程序后,原进程打开文件描述符扔保持打开。即可共享原进程文件描述符。...file) {//判断是否打开成功 printf("fopen failed!...---- popen优缺点 优点:可以使用shell扩展(比如命令可以使用通配符)。使用方便。 缺点:每调用一次popen,将要启动两个进程(shell和被指定程序)。资源消耗大。 ----

    60820

    【Linux】进程控制

    1、shell 初步实现 2、什么是当前路径 3、内建命令/外部命令 4、shell 最终实现 一、进程创建 1、再谈 fork 函数 我们在 进程概念与进程状态 对 fork 函数进行了初步介绍与使用...PATH路径下搜索文件,即对于替换Linux指令相关程序时我们不用带路径; e (env):表示自己维护环境变量; -函数名 参数格式- 函数是否需要带路径 是否使用当前环境变量 execl 列表 是...在 Linux ,我们可以使用 chdir 系统调用来改变进程工作目录: 在理解了当前路径是当前进程工作目录之后,我们就可以解释为什么我们 shell 执行 cd 命令后目录不改变了: myshell...我们可以使用 type 命令来区分 Linux 内置命令和外部命令: 其实我们上面对 cd 指令就是以内置命令方式来处理 – myshell 遇到 cd 命令时,自己直接来改变进程工作目录,...可以获取最近一个进程退出码 了: 虽然本地变量只在当前进程有效,但是使用 echo 查看本地变量时,shell 并不会创建子进程,而是直接在当前进程查找,自然可以找到本地变量; shell

    4.1K00

    【Linux】Linux进程控制 --- 进程创建、终止、等待、替换、shell派生子进程理解…

    在fork实现代码,执行return语句之前,代码核心逻辑肯定已经跑完了,这个时候OS已经有两个进程了,所以在执行return语句时候,其实已经有两个执行流分别执行fork当中return语句了...不同退出码都必须有相应退出码文字描述,来确定进程是因为什么原因而退出,这个文字描述可以自己定义,也可以使用系统映射关系来输出错误码文字描述,但这个使用并不频繁。 4. ?...也可以调用库函数exit或者使用系统调用接口_exit 如果没有exit,这个进程应该是一直运行不会退出,但是现在有了exit进程就会提前终止,并且退出码被设置成了111。...通过运行结果可以看出,在前10秒钟,两个进程都是休眠S状态,因为在等待显示器就绪,在接下来5秒钟,子进程变为了僵尸进程,状态S变为Z,然后在wait调用结束之后,子进程被父进程成功回收,只剩下继续休眠...我们程序没有环境变量PATH,带p没有意义,所以这里使用execl函数来进行程序替换。 4.如果子进程可以替换为我们自己写程序的话,那其他语言程序其实是都可以调用

    14.7K30

    UNIX高级环境编程 第三次实验 实现带参数简单Shell

    当fork()函数返回值为0时表示处 于子进程;而返回值大于0时表示处于父进程,此时返回值是子进程进程id。因此,fork()返回值可以用来划分仅仅适合父进程 和子进程执行程序段。...、fork 创建进程函 数fgets、waitpid(系统调用,用于等待子进程结束、获取子进程运行状态,本实验仅仅用它使父进程等待子进程结束)、exit退出函数 fcntl.h: 用到文件权限位、文件打开函数...一般命令都可以fork+execvp执行,fork创建一个子进程,调用一种exec函数时,该进程执行程序完全替换为新程序 而新程序则从其main函数开始执行; 但要注意exec并不创建新进程,所以前后进程...因此,我们可以使用execvp函数,仅需传入之前构造argv参数,从而间接执行系统调用execve: if ((pid=fork())<0)printf("fork error: %s\n", strerror...这两个函数通过open命令,将之前获取rfile 和wfile文件打开,获取File descriptor后,再使用dup2函数重定向STDIN_FILENO和STDOUT_FILENO,open函数采用权限位为

    93420

    《Linux操作系统编程》 第六章 Linux进程监控: fork函数使用,以及父子进程关系,掌握exec系列函数

    系统每个进程都有一个名为task_struct数据结构,它相当于“进程控制块”。...- vfork():保证子进程先运行,在调用execve()或exit()之前,与父进程数据是共享。...(包括进程运行时打开文件,申请内存等),并让其他进程进程控制块收集有关信息 (2) Linux中进程退出方式 ▪ 正常退出 - 在main函数执行return返回 - 在任意代码调用exit...(5) 孤儿进程 如果父进程在子进程终止之前终止,则子进程进程将变为init进程,保证每个进程都有父进程init进程调用wait函数进行善后 6.6 Linux中进程监控 (1) 进程进程状态...习题 在Linux创建进程主要有哪几种方式? 答:(1)在shell执行命令或可执行文件。(2)在代码(已经存在进程)调用函数创建子进程

    16910

    进程控制实验--fork()

    fork( )只是将父进程用户级上下文拷贝到新进程,而exec( )系列可以将一个可执行二进制文件覆盖在新进程用户级上下文存储空间上,以更改新进程用户级上下文。...exec( )系列系统调用在UNIX系统库unistd.h,共有execl、execlp、execle、execv、execvp五个,其基本功能相同,只是 以不同方式来给出参数。...一般,wait、exec联合使用模型为: int status;       ............ if (fork( )= =0)   {       ...........;       execl...它低8位反应子进程状态,为0表示子进程正常结束,非0则表示出现了各种各样问题;高8位则带回了exit( )返回值。exit( )返回值系统给出。...核心对wait( )作以下处理: (1)首先查找调用进程是否有子进程,若无,则返回出错码; (2)若找到一处于“僵死状态”进程,则将子进程执行时间加到父进程执行时间上,并释放子进程进程表项;

    2.4K80

    Linux下使用exec族函数进行进程替换

    虽然我们可以使用fork函数返回值不同来使得父进程和子进程执行代码不同。但是有时候父进程是一段c程序,子进程却是个shell。这个时候,fork就没法解决这个问题。因此exec函数是必须。...所以使用时候应当注意,如果还想回到原来进程继续执行,那么需要先使用fork函数来创建一个进程,在这个进程使用exec函数来完成进程替换。这样才能保证原进程能在exec调用后不被破坏。...代码里创建子进程是上一篇博客提到代码,在这里。 使用fork,而不是vfork原因是vfork会于原进程共享地址空间,fork则是复制原进程,从而创建一个原进程副本。...vfork则在exec函数调用之前这段时间是和父进程共享数据,直到遇到exec函数(或者是exit函数),才会成为一个独立进程,拥有自己地址空间。不再和父进程共享地址空间。...因此使用fork可以避免很多错误。 但是使用fork缺点是必须无法确定执行顺序,在这里我让父进程挂起2秒,从而使得子进程先于父进程执行。另外使用exec函数也可以完成shell命令。

    1.3K20

    Linux进程控制【进程程序替换】

    、胎噪更小轮胎显然就更合适了,针对不同使用场景替换不同轮胎,程序替换时也是这么个意思,执行特定任务 shell 外壳 bash 就是一个任务处理平台,当我们发出指令,如 ls、pwd、touch...", "-a", "-l", NULL); //程序替换多发生于子进程,也可以通过子进程退出码来判断是否替换成功 if(ret == -1) printf("程序替换失败!...程序能继承 bash 环境变量表了 在 bash 下执行程序,等价于在 bash 下替换子进程为指定程序,并将 bash 环境变量表 environ 传递给指定程序使用 其他没有带 e 替换函数...,根据程序名自动在 PATH 查找 e 则是 environ,是否手动传递环境变量表 3.2、替换现象 子进程程序替换后,并不会创建新进程,而是对原有程序 数据 和 代码 进行修改,可以通过替换以下程序观察...,学习使用了程序替换相关七大函数,最后还观察了程序替换后神奇现象,在学完这些知识后,我们就可以实现一个简单 bash,体验一下在自己程序输入指令操控 Linux 奇妙体验 如果你觉得本文写还不错的话

    23820

    Linux系统-进程控制

    仅仅是退出进程 exit在退出进程前,先执行用户通过 atexit或on_exit定义清理函数,关闭所有打开流,所有的缓存数据均写入(刷新缓冲区),最后调用_exit 示图: 示例:...kill掉,因为子进程已经死去,只能父进程等待回收 子进程PCB保留着退出前任务执行信息,而通过回收子进程我们可以知道子进程运行完成,结果对还是不对,或者是否正常退出 注:非必须,依执行程序和需求而定...,以此获取子进程退出信息 使用对应可以查看我们需要退出信息:WIFEXITED(status): 若为正常终止子进程返回状态,则为真(查看进程是否是正常退出);WEXITSTATUS(status...如果传递变量地址,操作系统会根据该参数将子进程退出信息反馈给父进程 使用对应可以方便查看我们需要退出信息:WIFEXITED(status): 若为正常终止子进程返回状态,则为真(查看进程是否是正常退出...CPU上,而我们也可以将exec系列函数看作是一种特殊加载器 五、实现简易shell shell视角执行: shell读取新一行输入,建立一个新进程,在这个进程运行程序并等待这个进程结束,

    1.5K30
    领券