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

如果execvp()成功,子进程会发生什么?

如果execvp()成功,子进程会发生以下几个步骤:

  1. 子进程的内存空间会被新的程序替换,即原来的程序代码、数据和堆栈会被新的程序代码、数据和堆栈所取代。
  2. 新的程序代码会从main函数开始执行,原来的程序代码不再执行。
  3. 子进程的文件描述符表会被保留,不受影响。
  4. 子进程的信号处理方式会被保留,不受影响。
  5. 子进程的进程ID(PID)不会改变。

总结:execvp()函数用于在子进程中执行一个新的程序,如果执行成功,子进程的内存空间会被新的程序替换,新的程序从main函数开始执行,子进程的文件描述符表和信号处理方式会被保留,子进程的PID不会改变。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供弹性计算能力,满足各类业务需求。详情请参考:https://cloud.tencent.com/product/cvm
  • 腾讯云容器服务(TKE):提供高度可扩展的容器化应用管理平台,简化容器集群的创建、运维和弹性伸缩。详情请参考:https://cloud.tencent.com/product/tke
  • 腾讯云函数计算(SCF):无需管理服务器,按需运行代码,实现事件驱动的无服务器架构。详情请参考:https://cloud.tencent.com/product/scf
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

---- 前言 进程 在被创建后,共享的是 父进程 的代码,如果想实现自己的逻辑就需要再额外编写代码,为了能让 进程 执行其他任务,可以把当前 进程 的程序替换为目标程序,此时需要用到 Linux...针对不同的使用场景替换不同的轮胎,程序替换时也是这么个意思,执行特定任务 shell 外壳中的 bash 就是一个任务处理平台,当我们发出指令,如 ls、pwd、touch 等指令时后,bash 创建进程...printf("程序替换前,you can see me\n"); int ret = execl("/usr/bin/ls", "ls", "-a", "-l", NULL); //程序替换多发生进程...,比如文件流操作中的 open、close、write 等函数,无论什么语言的文件流操作函数都需要调用它们 ---- 2.7、函数7 execvpe 对 execvp 的再一层封装,使用方法与 execvp...因为是同一个进程,所以对父进程没有任何影响,体现了进程间的独立性 在进程执行程序替换前,进程和父进程共享一份只读区域的数据,但因为发生了程序替换,触发 写时拷贝 机制,令进程读取另一块区域的数据

23520
  • 【Linux】详解进程程序替换

    一、替换原理 用fork创建进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),进程往往要调用一种exec函数以执行另一个程序。...程序替换一旦成功,exec*后序的代码不再执行。因为原程序的数据和代码被替换掉了。exec*程序替换接口只有失败返回值,没有成功返回值。...二、进程进行程序替换 通过进程进行程序替换可以让进程帮我们去做一部分工作,而且进程发生程序替换不会影响父进程执行,因为替换时代码和数据会发生写时拷贝。...名字中带p的这个p指的是PATH,也就是说你不用告诉系统,程序在哪里,只要告诉我名字就行,系统自动到你这个进程的PATH环境变量中所保存的路径中寻找。...可以通过地址空间继承的方法,让进程拿到父进程的所有环境变量。如果我们想传递全新的环境变量表给进程,就要使用带e的程序替换接口。

    7610

    进程控制第二弹(进程程序替换)

    所以为什么上述现象中,原来的进程中printf("testexec end! ...\n"); 没有执行的原因是,调用execl函数后,去执行ls程序了,原来的代码和数据被替换了。...不用关心exec系列函数的返回值,只要替换成功,就不会向后面执行;反之,一定是替换失败。...但是ls不仅仅只有数据,还有代码,因此代码也需要发生写时拷贝。虽然代码是可读的,但是在操作系统看来都无所谓。所以重新开辟内存,将ls代码加载到物理内存,修改进程的映射关系。...至此,只要程序替换成功,彻底将进程和父进程分开了。...父进程本身就有一批环境变量,从“爷爷进程”来的,即bash 这个传参,如果传的是自定义的环境变量,那么就整体替换所有环境变量 传环境变量有三种情况: 用全新的给进程 用老的环境变量给进程,environ

    7710

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

    如果进程只是运行与父进程完全一样的程序,那用处是很有限的。要让进程运行不同于父进程的程序,就必须调用execve函数,它是 所有其他exec函数的基础。...一般命令都可以由fork+execvp执行,由fork创建一个进程,调用一种exec函数时,该进程执行的程序完全替换为新程序 而新程序则从其main函数开始执行; 但要注意exec并不创建新进程,所以前后的进程...,若有重定向输入输出,则在redirect_stdin或 redirect_stdout中处理,execvp填入可执行文件参数,进程开始执行,若出错才会执行下面的execvp error打印错误语句,...waitpid等 待特定fork后进程号结束,若出错则同样做出错打印信息处理 2.6 cd命令 对于一个自制shell如果没有cd命令就不算一个合格的shell,因为cd是shell内部命令,如果用execve...系统调用,fork出进程改变的是 进程的目录,父进程的目录仍然没有发生改变。

    92320

    昨天遇到collectd exec插件的bug,顺便发现他们不按套路出牌啊

    带有bug的版本: 先setenv()设置主进程自己的环境变量,然后尝试fork(),如果成功,在进程execvp();主进程重新unsetenv()恢复主进程自己的环境变量。...在多个exec密集执行的时候,都会访问主进程的环境变量,会有race condition,偶尔会发生前一个exec插件刚unsetenv()然后后一个exec插件开始fork()的情况,丢失环境变量。...修复后的版本: 先fork(),在进程里准备环境变量数组,尝试execvpe()带签署环境变量数组作为参数,执行新进程(execvpe()为GNU专有扩展),或者先设置extern char **environ...指针指向准备好的数组,然后execvp()执行新进程直接继承。...别人家套路: 先准备环境变量数组,然后fork(),在进程里execve()并使用前述环境变量数组作为参数。

    13110

    Linux进程控制

    #include pid_t fork(void); 运行成功,父进程返回进程ID,进程饭0;运行出错返回-1。...但是,这种情况下,如果使用_exit()退出,导致某些数据未被保存,而用exit()则不会有问题。...进程一旦调用wait后,就立刻阻塞自己,如果当前进程的某个子进程已退出,则收集其信息,否则wait一种阻塞在这里,直到有一个僵死进程出现。...waitpid()示例 父进程进程分别睡眠10秒钟和1秒钟,代表所作的相应工作。父进程利用工作的简短间歇查看进程是否退出,如果退出就收集它。...获取进程返回状态 对于wait()和waitpid()中的status参数,当其值不为NULL时,进程的退出状态以int值的形式保存其中,通过一套专门的宏(macro)可以读取存入的状态值,这里只列举两个常用的宏

    2K30

    【Linux】进程的程序替换

    程序替换 1.创建进程的目的是什么? 目标:为了让进程帮父进程执行特定的任务 具体做法:1....,如果影响父进程,就不应该打印父进程的这句话了 ---- 过了5秒钟,父进程结果打印出来,说明父进程不受进程影响 ---- 程序替换只会影响调用进程进程具有独立性 父子进程都有自己独立的PCB 地址空间...页表 也自己的映射关系 虽然代码有可能是跟父进程共享,当进程进行程序替换的时候,进程会加载新进程的代码和数据 操作系统会发生写时拷贝,将代码和数据进行区分 ,使进程形成新的映射关系...,就会跑去执行新程序,失败了就会继续向后运行 所以execl程序替换成功不会有返回值——>如果替换失败,一定有返回值——>如果失败了,必定返回——>只要有返回值就失败了 说明不用对execl函数的返回值进行判断...int execvp(const char *file, char *const argv[]); 带p:代表当执行程序的时候,只需要指定程序名即可,系统自动在PATH环境变量中查找 v代表vector

    2K30

    【Linux】shell命令行简单解释器

    且在最终strtok返回NULL。...fork创建进程 利用fork创建进程,同时父进程需要等待进程退出返回结果 另外我们还需要选择替换函数execvp:首先替换函数需要先带上v,可将所有的执行参数放入数组中统一传递,其次还要选择带上...shell运行原理 同时,在理解一下shell的运行原理:shell内部提取命令行做分析,然后调用exec. shell执行命令必须通过创建进程如果不创建进程会把我们所有的shell全部替换,所以执行命令时一般磁盘上的程序必须创建进程...没有发生改变是因为自己写的shell执行很多命令都要fork()创建进程,让进程执行的cd,进程有自己的工作目录,所以更改的进程的目录,进程执行完毕,继续用的是父进程,既shell,并没有影响父进程...[i++] = strtok(NULL," ")); //如果是cd命令, 不需要创建进程,让shell自己执行对应的命令,本质就是执行系统接口 //像这种不需要我们的进程来执行

    21230

    【Linux】万字解读<进程控制>:创建&中止&等待&替换

    ,父子再不写入时, 数据也是共享的 当任意一方试图写入,便以写时拷贝的方式各自一份 副本 (蓝色部分) ,具体见下图: 注意,其发生写时拷贝时,权限也相应变化 2.fork函数/进程创建的场景...查看进程退出码 ?:保存的是最近一个进程执行完毕时的退出码 情况1:?= 0 ,表示成功 情况2:?!=0 , 可以用1,2,3,4,5不同的数字表示不同的错误原因 echo $?...父进程通过 进程等待 的方式,回收进程资源,获取进程退出信息 有时候进程 等待硬件资源 ,利用wait进程等待把自己挂起 3.如何进行等待(wait&waitpid) 【1】wait函数参数与返回值介绍...,waitpid返回收集到的进程进程ID; 如果option设置了选项WNOHANG,而调用中waitpid发现没有已退出的进程可收集,则返回0; 如果调用中出错,则返回-1 ,这时errno...1.进程替换概念 【1】进程替换概念 我们所创建的所有的进程,执行的代码,都是父进程代码的一部分 如果我们想让进程 执行新的程序呢???

    8410

    Linux之模拟shell命令行解释器

    三、fork创建进程 利用fork创建进程; 替换函数需要带上v和p,即execvp函数。 为啥要用进程去执行命令?...答:如果不创建进程,而是让bash直接去执行进程,会将我们的bash直接替换为其他程序,shell就不能继续正常执行其他指令了(就回不到输入界面了)。.../cd path等命令时,发现路径并没有发生修改,这是为啥? 答:因为我们自己写的shell,执行很多命令都要用fork创建进程,让进程去执行。...当进程执行cd命令时,更改的时进程的工作目录而与父进程无关,因此父进程的路径并不会发生修改。 因此,对于cd命令我们应该用内建命令:该命令不需要子进程执行,而是让bash自己执行。...什么是当前路径? 当前路径就是cwd。 cwd -> 当前进程所在的工作目录(默认是文件存储在磁盘的路径); exe -> 当前运行的是磁盘路径下的哪个进程

    24820

    Linux系统-进程控制

    0,对父进程返回进程的pid 写时拷贝 概念: fork成功之后父子代码共享,当父子不写入数据时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本 为什么数据要进行写时拷贝...因此,对于进程来说,父进程是不需要被标识的;而对于父进程来说,进程是需要被标识的,因为父进程创建进程的目的是让其执行任务的,父进程只有知道了进程的PID才能很好的对该进程进行深入操作 为什么...exit的参数来调用exit函数,而使用exit函数退出进程前,exit函数先执行用户定义的清理函数、冲刷缓冲,关闭流等操作,然后再调用_exit函数终止进程 4)异常退出 向进程发生信号 如在进程运行过程中向进程发生.../waitpid立即返回,并且释放资源,获得进程退出信息 如果在任意时刻调用wait/waitpid,进程存在且正常运行,则进程可能阻塞 如果不存在该进程,则立即出错返回 示图:...如果传递变量地址,操作系统根据该参数将进程的退出信息反馈给父进程 使用对应的宏可以方便查看我们需要的退出信息:WIFEXITED(status): 若为正常终止进程返回的状态,则为真(查看进程是否是正常退出

    1.5K30

    【Linux】开始学习进程替换吧!

    我们可以想要运行其他代码可以通过创建进程来实现,但是这样也肯定是同一种语言,如果想要运行其他语言,那是不是有种方法可以调度一个进程来当做进程呢??? 我们开始今天的学习吧!...而且我们不用关心exec*函数的返回值,只要替换成功了,就不会向后运行(也就用不到它的返回值了),只要继续运行那一定就是替换失败了!!! 那如果不想替换掉我们的程序,还想要打开一个新程序呢???...我们接着向下看 2.3 单进程改为多进程 方法很简单,我们通过fork函数创建一个进程,让进程来执行我们的新程序不就可以了吗!...,然后在进程中进行进程替换。...来看效果: 让进程完成父进程代码的一部分 让进程执行一个全新的程序(会发生写时拷贝,建立全新的物理内存空间) 2.4 理解使用exec* 函数 这些函数原型看起来很容易混,但只要掌握了规律就很好记

    8910

    【Linux】Linux进程控制>进程创建&&进程终止&&进程等待&&进程程序替换

    ); 返回值: 当正常返回的时候waitpid返回收集到的进程进程ID; 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的进程可收集,则返回0; 如果调用中出错,则返回-...如果进程已经退出,调用wait/waitpid时,wait/waitpid立即返回,并且释放资源,获得进程退出信息 如果在任意时刻调用wait/waitpid,进程存在且正常运行,则进程可能阻塞...如果不存在该进程,则立即出错返回 3.2.3 获取进程status wait和waitpid,都有一个status参数,该参数是一个输出型参数,由操作系统填充 如果传递NULL,表示不关心子进程的退出状态信息...否则,操作系统根据该参数,将进程的退出信息反馈给父进程 status不能简单的当作整形来看待,可以当作位图来看待,具体细节如下图(只研究status低16比特位): 测试代码: #include...所以要写一个shell,需要循环以下过程: 获取命令行 解析命令行 建立一个进程(fork) 替换进程execvp) 父进程等待进程退出(wait) 根据这些思路,和我们前面的学的技术,就可以自己来实现一个

    13710

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

    当我们创建 了一个进程之后,通常将进程替换成新的进程映象,这可以用exec系列的函数来进行。当然,exec系列的函数也可以将当前进程替换掉。...execv、execvp和execvpe的第二个参数是一个字符串数组,新程序在启动时会把在argv数组中给定的参数传递到main 名字含字母“p”的函数搜索PATH环境变量去查找新程序的可执行文件...根目录 umask 文件锁 进程信号屏蔽 未处理信号 资源限制 进程时间 而下面属性是发生变化的: 文件描述符如果存在close-on-exec标记的话,那么打开的文件描述符会被关闭。...然后fork来说,因为进程和父进程的地址空间是一样的,所以信号处理方式保留了下来。 接下来进行exec,会将所有设置成为捕捉的信号都修改成为默认处理,而原来已经设置成为忽略的信号就不发生改变。...因为如果替换进程映像成功,那么直接到替换进程的main函数开始执行,不会返回,故不会输出Exiting main ...

    2.1K60

    Linux之进程控制

    那么给父进程返回进程的pid,给进程返回0,可以很方便的区分父子进程。 同一个变量,为什么会有两个不同的值呢?...四、进程等待 1.进程等待的场景 之前讲进程状态的时候,我们讲到一种特殊的转态:僵尸状态:进程退出,父进程没有等待进程(没有回收进程的资源),造成进程处于僵尸状态,造成内存泄漏,同时这种状态的进程无法被杀死...,如果不关心进程的退出状态可以设置为NULL; **返回值:**wait成功返回等待的进程pid,等待失败返回-1。...设置为0时表示,阻塞式等待进程;设置为WNOHANG时,表示非阻塞式等待进程。 返回值:如果等待成功,返回所等待的进程pid;如果等待失败,则返回0。...因此,原进程后续的代码会被新进程的代码和数据所覆盖,因此就不会执行剩余代码了。 这也是为什么只有当程序替换失败才会有返回值,因为如果替换成功就不会执行接下来的代码,返回值就无意义。

    18520

    Linux进程控制

    那么,为什么这样?接下来我们好好地讨论一下fork函数。 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程进程,而原进程为父进程。...2.如何理解fork函数返回后,进程中返回0,父进程返回进程id? 3.如何理解同一个id值,为什么保存两个不同的值,让if  else  if同时执行?...①如果进程已经退出,调用wait/waitpid时,wait/waitpid立即返回,并且释放资源,获得进程退出信息。...如果传递NULL,表示不关心子进程的退出状态信息。否则,操作系统根据该参数,将进程的退出信息反馈给父进程。...如果调用出错则返回-1 所以exec函数只有出错的返回值而没有成功的返回值。因为成功的返回值没有必要,都已经替换了进程了,即使返回了,这个值也用不了。

    2.4K30

    Unix-Linux编程实践教程-chapter08-sh

    进程ID,所有者,大小及其他属性 系统调用fork通过复制进程来建立一个几乎和原来进程完全相同的 副本进程.这个新建的进程被称为进程 一个程序通过调用exec函数族在当前进程中执行一个新的程序 一个程序能通过调用...运行一个程序 2 建立一个进程 3 等待exit() 一个程序运行另一个程序: 调用execvp 内核将新程序载入到当前进程,替代当前进程的代码和数据,因此最好 还是fork一个进程,然后进程来调用...execvp 如何建立新进程: fork 系统调用fork正是解决shell只能运行一条命令这个问题所需要的 父进程等待进程结束: 进程调用wait等待进程结束 pid = wait(&status...); wait暂停调用它的进程直到进程结束 最终进程结束任务并调用 exit(n) 键盘信号发给所有连接的进程 execvp/exit call/return 这种通过参数和返回值在拥有私有数据的函数间通信的模式是结构化程序...设计的基础 全局变量和fork/exec 全局变量破坏封装原则,但有时候去掉更糟糕.Unix提供方法来建立 全局变量,环境是一些传递给进程的字符串型变量集合 execvp不是一个系统调用,而是一个库函数

    1K20

    【Linux】进程控制

    如果不关心进程退出码,return 0即可,如果关心进程退出码的时候要返回特定的数据表明特定的错误 退出码的意义:0表示成功成功只有一个。...所以exit()终止进程主动刷新缓冲区,_exit()终止进程,不会刷新缓冲区。...进程什么要等待 1.父进程通过进程等待的方式,回收进程资源 2.获取进程退出信息 进程等待的方法 wait 返回值:成功返回被等待进程pid,失败返回-1。...否则,操作系统根据该参数,将进程的退出信息反馈给父进程。status不能简单的当作整形来看待,可以当作位图来看待 次低8位:退出状态((>>8)&0xFF)。低7位:终止信号(&0x7F)。...对于返回值问题: 这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回,和接下去的代码无关了。如果调用出错则返回-1,所以exec函数只有出错的返回值而没有成功的返回值。

    19430
    领券