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

在execvp返回之后,为什么我的程序不会从它停止的地方开始?

在使用execvp函数时,程序会在执行新的程序后停止执行原有程序的代码。如果在execvp返回后,程序仍然从停止的地方开始执行,这通常意味着execvp函数没有成功执行新的程序。

execvp函数的作用是在当前进程中执行一个新的程序,并将参数列表传递给新程序。如果新程序执行成功,execvp函数将不会返回。如果execvp函数返回,则表示新程序没有成功执行,通常是因为指定的程序路径或名称不正确。

要解决这个问题,可以检查execvp函数的参数是否正确,并确保指定的程序路径或名称正确无误。同时,可以使用perror函数或strerror函数来获取更详细的错误信息,以便更好地诊断问题。

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

希望这个答案能够帮助您解决问题。

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

相关·内容

fork,wait和exec

fork,wait和exec fork系统调用 wait系统调用 exec系统调用 为什么要把fork和exec分开 ---- fork系统调用 1、子进程不会 main()函数开始执行,而是直接...但是,我们常常想运行不同程序,exec()正好做这样事 这个例子中,子进程调用 execvp()来运行字符计数程序 wc。...因此,并没有创建新进程,而是直接将当前运行程序(以前 p3)替换为不同运行程序(wc)。子进程执行 exec()之后,几乎就像p3.c 从未运行过一样。...fork和exec分开 构建UNIX shell 时候非常有用,因为这给了shell fork 之后exec 之前运行代码机会,这些代码可以在运行新程序前改变环境,实现一些有趣功能。...这样,即将运行程序wc 输出结果就被发送到该文件,而不是打印屏幕上。

98220

对python中return与yield区别详解

首先比较下return 与 yield区别: return:程序函数中返回某个值,返回之后函数不在继续执行,彻底结束。...看做“return”,这个是直观首先是个return,普通return是什么意思,就是程序返回某个值,返回之后程序就不再往下运行了。...yield,代码输出这个: starting... 4 ******************** res: None 4 直接解释代码运行顺序,相当于代码单步调试: .程序开始执行以后...,这个时候和上面那个差不多,不过不同是,这个时候是刚才那个next程序停止地方开始执行,也就是要执行res赋值操作,这时候要注意,这个时候赋值操作右边是没有值(因为刚才那个是return出去了...next停止地方执行,所以调用next时候,生成器并不会foo函数开始执行,只是接着上一步停止地方开始,然后遇到yield后,return出要生成数,此步就结束。

74210

Linux进程控制

一.进程创建 fork()函数: 进程概念这篇文章中,我们浅浅地了解了一下fork函数,功能是让父进程去创建一个子进程,并且有两个返回值,对应着父进程返回值和子进程返回值。...main返回 2. 调用exit 第一种很好理解,我们程序都是main函数开始,最后由main函数return 0来返回,终止程序。对于第二种,我们需要认识exit()函数。...char *const argv[]); 函数解释: 这些函数如果调用成功则加载新程序启动代码开始执行,不再返回。...所以我们回到上面的那个问题,为什么第二个printf没有执行? 答案就是:因为第二个printf是execl之后执行了execl后,第二个printf被覆盖掉了,所以也就没办法执行了。...由此,子进程程序替换也不会影响到了父进程。

2.4K30

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

基本原理 当进程调用一种exec函数时,该进程用户空间代码和数据完全被新程序替换,从新程序启动例程开始执行。...调用exec并不创建新进程,所以调用exec前后该进程id并未改变 我们知道,进程=内核数据结构+代码数据 程序替换本质是将当前进程代码和数据进行替换。 替换时候,会不会创建新进程?...所以为什么上述现象中,原来进程中printf("testexec end! ...\n"); 没有执行原因是,调用execl函数后,去执行ls程序了,原来代码和数据被替换了。...exec系列函数执行完毕后,后续代码不见了,因为被替换了,因此没有机会去执行了。 不用关心exec系列函数返回值,只要替换成功,就不会向后面执行;反之,一定是替换失败。...可执行程序testexecl磁盘中加载到物理内存中。

6810

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

这个函数作用是在当前进程上下文中启动一个新程序,并替换当前进程映像为新程序映像。调用execl函数后,当前进程将停止执行,并由新程序开始执行。...\n"); return 0; } 如果execl函数调用成功,那么实际上不会返回,因为当前进程映像已经被新程序替换。如果调用失败,它会返回-1,并设置全局变量errno以指示错误原因。...因为被替换掉了,这也是什么代码没有输出execl end原因了 exec函数调用成功,那么实际上不会返回值;调用失败,它会返回-1 exec函数不会创建新进程。...这个过程涉及将新程序内容磁盘加载到内存中,为进程提供执行所需资源。...,定义 头文件中。

14310

exec族

这个一直没搞太明白,相识度高是一回事,不会用又是另一回事儿。 所以今天又温故了一遍: 为什么需要exec函数?...exec族函数可以直接把一个编译好可执行程序直接加载运行。 有了exec族函数后,典型打父子进程程序是这样:子进程需要运行程序被单独编写、单独编译链接成一个可执行程序(hello)。...主进程为父进程,fork创建了子进程后子进程中exec来执行hello,达到父子进程分别做不同程序同时(宏观上)运行效果。...,出错返回-1....PATH变量查找子程序文件 e 函数传递指定参数envp,允许改变子进程环境,无后缀e时,子进程使用当前程序环境 下面找到一些通俗易懂栗子,算是让明白了一点: #ifdef HAVE_CONFIG_H

1.1K10

Linux进程控制

Linux进程简介 进程是操作系统中一个重要概念,它是一个程序一次执行过程,程序是进程一种静态描述,系统中运行每一个程序都是进程中运行。...新进程不是被创建,而是被复制,或是以前进程复制而来。Linux中所有的进程都是由一个进程号为1init进程衍生而来。...pid = fork();之前,只有一个进程执行代码,但在该语句之后,有两个进程执行之后代码,根据pid不同执行不同语句。...与一般情况不同,exec函数族执行成功后不会返回,因为调用进程实体,包括代码段、数据段和堆栈段都被新内容取代,只是进程ID等一些表面上信息仍保持原样。...exit()调用之前要检查文件打开情况,把文件缓冲区内容写回文件;_exit()则直接使进程停止,清除其使用内存空间,并销毁其在内核中各种数据结构。

2K30

Linux-Copy On Write写时复制机制初探

(函数族exec( )是一组函数统称, 包括了execl()、execlp()、execv()、execle()、execve()、execvp()等) fork fork是类Unix操作系统上创建进程主要方法...); return 0; } 输出结果 是子进程,由父进程fork出来 统计结果是: 1 是父进程 统计结果是: 1 fork 函数会有两次返回 1) 将子进程PID返回给父进程...---- 为什么有了COW? 早期 Unix 实现 fork 系统调用时,并没有使用该技术,创建新进程开销很大。...现在Linuxfork()使用写时拷贝页来实现新进程创建,它是一种可推迟甚至避免数据拷贝技术,刚开始时内核并不会复制整个地址空间,而是让父子进程共享地址空间,只有写时才复制地址空间,使得父子进程都拥有独立地址空间...如果子进程不对内存空间进行写入操作的话,内存空间中数据并不会复制给子进程,这样创建子进程速度就很快 ,因为不用复制,直接引用父进程物理空间 ,并且如果在fork函数返回之后,子进程第一时间exec

3.2K10

【Linux】进程控制

进程常见退出方法: main函数return返回。...进程为什么要等待 1.父进程通过进程等待方式,回收子进程资源 2.获取子进程退出信息 进程等待方法 wait 返回值:成功返回被等待进程pid,失败返回-1。...当进程调用一种exec函数时,该进程用户空间代码和数据完全被新程序替换,从新程序启动 例程开始执行。...printf也是代码,exec之后,exec执行完毕之后代码已经全部被覆盖,开始执行新代码,所以第二个printf就无法执行了。...对于返回值问题: 这些函数如果调用成功则加载新程序启动代码开始执行,不再返回,和接下去代码无关了。如果调用出错则返回-1,所以exec函数只有出错返回值而没有成功返回值。

18430

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

fork代码后,内核做: 分配新内存块和内核数据结构给子进程 将父进程部分数据结构内容拷贝至子进程 添加子进程到系统进程列表当中 fork返回开始调度器调度 当一个进程调用fork之后,就有两个二进制代码相同进程...而且它们都运行到相同地方。...另一个after消息有28112打印。注意到进程28112没有打印before,为什么呢?如下图所示: 所以,fork之前父进程独立执行,fork之后,父子两个执行流分别执行。...当进程调用一种exec函数时,该进程用户空间代码和数据完全被新程序替换,从新程序启动例程开始执行。...其中时间左向右。shell由标识为sh方块代表,随着时间流逝左向右移动。shell用户读入字符串"ls"。

10510

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

—— 尾田荣一郎《海贼王》 开始学习进程替换吧 1 前言 通过学习进程替换,我们可以体会到多语言混搭快乐,可以C语言直接蹦到python ,也可以c++里运行java代码。是不是很厉害!...),可是执行是我们代码,怎么就运行了ls 这个程序呢?...当进程调用一种exec函数时,该进程用户空间代码和数据完全被新程序替换,从新程序启动 开始执行。 调用exec并不创建新进程,所以调用exec前后该进程id并未改变 没有创建新进程!!!...exec* 就类似一个Linux 上加载函数。 而且我们不用关心exec*函数返回值,只要替换成功了,就不会向后运行(也就用不到返回值了),只要继续运行那一定就是替换失败了!!!...这样应该就可以运行ls命令还不会影响原本程序

7810

Linux之进程控制

fork函数实现在操作系统内部,当这个函数准备返回时,核心代码已经执行完了也就是子进程已经被创建了,并且已经OS运行队列中准备被调度了。...2.进程退出方法 主函数(main函数)return返回程序任意位置调用exit(code); 系统调用_exit(code); 3....3.替换原理 为什么调用替换函数后,原程序剩余部分不再执行?...当进程调用exec系列函数时,该进程用户空间代码和朱家具完全被新程序替换,从新程序启动例程开始执行。 要注意,调用exec并不创建新进程,所以调用exec前后该进程id并未改变。...因此,原进程后续代码会被新进程代码和数据所覆盖,因此就不会执行剩余代码了。 这也是为什么只有当程序替换失败才会有返回值,因为如果替换成功就不会执行接下来代码,返回值就无意义。

16920

C++中exec()函数

exec()函数C++中是一个进程控制函数,用于创建新进程执行其他程序或命令行指令。exec()函数可以替换当前进程代码和数据,创建新进程运行其他程序。...前言 fork 函数之后,如果想要把子进程换成一个想要执行进程,这时,就不得不使用 exec()函数了,这也是 fork()意义所在。...常见fork()调用例子有很多,比如从 wechat发起一个语音电话、 bash或者zsh执行一个 a.out 程序,都是利用exec系统调用将新产生子进程完全替换成目标进程。.../fork_example 程序就会结束!以上例子,可以看到我们子进程,就是由一个父进程fork()之后替换。...(const char *file, char *const argv[]) 参数: path参数表示你要启动程序名称,包括路径名; arg参数表示启动程序所带参数,一般第一个参数为要执行命令名 返回

23520

极简shell制作

,后续程序不会往下走,又因为进程之间具有独立性,所以需要创建一个子进程来完成进程替换这件事情。...带 ‘v’ 接口也有三个,execvp 接口是最好选择,为什么大家可以自己思考一下,很简单: execvp(argv[0], argv);//根据命令环境变量里查找,根据选项做出对应动作   ...✈️内建命令处理 cd命令处理   我们来看这样一个现象:   命名已经切换目录很多次了,但是为什么目录没有改变呢?...路径显示问题   这里还有一个很明显错误行为,命令行解释器路径开始就没有变过,其实是因为我们没有更新PWD环境变量,我们可以手动给当前进程更新环境变量,使用一个数组存储当前目录,再使用 putenv...这个命令,这个命令需要显示上一个进程退出码,而获取进程退出码,这个时候我们就需要先在全局范围内设置退出码变量: int lastcode = 0;//退出码   退出码是执行完进程之后返回结果,

11110

操作系统实验二归纳

这些函数调用成功后不会返回,其进程正文(text),数据(data)和栈(stack)段被待执行 程序程序覆盖。...execv 和 execvp 函数提供指向 NULL 结尾字符串指针数组作为新程序参数列表。作为约 定,指针数组中第一个元素应该指向执行程序名自身。指针数组必须用 NULL 指针结束。...这个附加参数是指向 NULL 结尾字符串指 针数组,必须用 NULL 指针结束。其它函数当前进程 environ 外部变量中获取新进程环境。...execlp和execvp可根据path搜索合适程序运行,其它则需要给出程序全路径。 execve()类似 execv(),但是加上了环境处理。...,创建一个进程,如果该进程pid<0(当然创建fork成功会返回大于0数)提示fork失败。

74950

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

各种替换函数间关系 这些函数都属于 exec 替换家族,所以它们返回值都一样 注意: 这七个函数只有程序替换失败后才会有返回值,返回 -1,程序替换成功后不返回 程序都已经替换成功,后续代码也都将被替换...,只要待替换程序路径位于 PATH 中,就不会替换失败 2.4、函数4 execvp execv 加个 p 也能实现自动查询替换,即 execvp #include int execvp.../other/CPP", NULL, environ); //继承环境变量表 结论: 如果主动传入环境变量后,待替换程序原环境变量表将被覆盖 现在可以理解为什么 bash 中创建程序并运行,...,列表传递 v 为 vector,顺序传递 p 表示 PATH,根据程序名自动 PATH 中查找 e 则是 environ,是否手动传递环境变量表 3.2、替换现象 子进程程序替换后,并不会创建新进程...,在学完这些知识后,我们就可以实现一个简单 bash,体验一下自己程序中输入指令操控 Linux 奇妙体验 如果你觉得本文写还不错的话,期待留下一个小小赞,你支持是分享最大动力!

20320

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

我们知道子进程退出时会变成僵尸进程: 僵尸进程无法被杀死,需要通过进程等待来杀掉,进而解决内存泄漏问题---必须解决 我们要通过进程等待,获得子进程退出情况---知道布置给子进程任务,完成怎么样了...在理解什么是进程替换之前,我们先来看看进程替换怎么使用,下面是操作系统提供进程替换一些函数 这些函数如果调用成功则加载新程序启动代码开始执行,不再返回。...对于像execl 和 execlp 有可变参数函数,其实它们使用方法很简单,第二个参数开始,参数写法就很我们命令行中一样,且最后一个参数是NULL。...也就是 execl 前面的代码会被执行,后面的代码不会被执行,这是为什么?...进程替换原理: 进程替换时,只会替换掉物理内存中原来程序代码和数据,其它不会动,且调用exec并不创建新进程,所以调用exec前后该进程id并未改变。

21410

【Linux】进程理解与学习-程序替换

如下图所示: 程序替换原理 原理图解 ​ 通过上图,也解释了为什么执行我们进程时,execl函数后面的end打印并没有执行,因为我们执行完打印begin后,开始调用系统调用函数execl,将新程序...当然我们也可以通过代码来验证一下: ​ 多进程对应程序替换 当然,假如我们使用fork创建子进程,让子进程完成程序替换,子进程程序替换并不会影响父进程,这是因为父子进程都有各自独立PCB,并且由于写时拷贝机制存在....); 对于该函数来说: 返回值:失败返回-1,替换成功执行新程序。 path参数:新程序路径位置(找到) arg参数:新程序名称(执行) ......对于该函数: 返回值:替换失败返回-1 file传程序名,会根据程序名自动PATH中搜索该程序对应路径。(找到,不需要我们传具体路径,会自动匹配) 后面的arg表示程序名(执行) ......int execvp(const char *file, char *const argv[]); 对于该函数: 返回值:替换失败返回-1 file:程序名,会根据程序名自动搜索PATH中对应路径

1.1K30

【Linux】详解进程程序替换

当进程调用一种exec函数时,该进程用户空间代码和数据完全被新程序替换,从新程序启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程id并未改变。...exec*程序替换接口只有失败返回值,没有成功返回值。...\n"); return 0; } 2.1、让子进程执行自己程序    自己写了一个C++程序,向替换子进程帮我跑一下: //C++程序 #include using...名字中带p这个p指的是PATH,也就是说你不用告诉系统,程序在哪里,只要告诉名字就行,系统会自动到你这个进程PATH环境变量中所保存路径中寻找。...execvp也只是将execv前面的路径换成程序名而已。不过这里要强调是:不要忘了路径最前面的那一个斜杠,还有数组结束标志是NULL,一定要在数组最后加上NULL。

5910

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

当fork()函数返回值为0时表示处 于子进程中;而返回值大于0时表示处于父进程中,此时返回值是子进程进程id。因此,fork()返回值可以用来划分仅仅适合父进程 和子进程执行程序段。...fork()函数返回值为-1时表示出错。 如果子进程只是运行与父进程完全一样程序,那用处是很有限。要让子进程运行不同于父进程程序,就必须调用execve函数,它是 所有其他exec函数基础。...execve函数把调用它进程程序,替换成execve函数参数所指定程序。运行execve函数成功后,进程 将开始运行新程序,也就是execve函数参数所指定程序。...一般命令都可以由fork+execvp执行,由fork创建一个子进程,调用一种exec函数时,该进程执行程序完全替换为新程序 而新程序则从其main函数开始执行; 但要注意exec并不创建新进程,所以前后进程...,若有重定向输入输出,则在redirect_stdin或 redirect_stdout中处理,execvp填入可执行文件参数,子进程开始执行,若出错才会执行下面的execvp error打印错误语句,

89620
领券