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

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

文章目录 1.进程程序替换 1.1概念 1.2原理 1.3使用一个`exec` 系列函数 execl()函数 结论与细节 2.多进程时的程序替换 3.其他几个exec系列函数 也可以调用其他语言的程序...1.2原理 当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换 替换完成后,控制权将转移到新程序的入口点,开始执行新程序的代码。...arg0:新程序的参数列表的开始,通常这会是新程序的名称(尽管这不是强制的,但它通常用于错误消息和程序内部)。 ...:一个可变参数列表(参数的数量不固定),新程序的参数列表,必须以NULL结尾。...因为被替换掉了,这也是什么代码没有输出execl end的原因了 exec函数调用成功,那么它实际上不会有返回值;调用失败,它会返回-1 exec函数不会创建新的进程。...进程具有独立性,在进行程序替换时要进行写时拷贝 写时拷贝的本质就是开辟新的空间 shell是如何运行起来一个指令的?

22210

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

#include pid_t fork(void); 返回值:在子进程中返回0 在父进程中返回子进程id,出错返回-1 【2】fork函数中的写时拷贝 通常,父子代码共享...,父子再不写入时, 数据也是共享的 当任意一方试图写入,便以写时拷贝的方式各自一份 副本 (蓝色部分) ,具体见下图: 注意,其发生写时拷贝时,权限也会相应变化 2.fork函数/进程创建的场景...只有失败才有返回值 演示: 当程序替换成功时,打印语句begin和执行替换后的语句,不打印语句end 当程序替换失败时,打印语句begin和语句end //注:我们只要知道下面execl函数是 起到进程替换的作用就行...类函数解释&命名规则&使用演示 【1】exec类函数 exec类函数有如下几种:都是为了满足各种调用的场景 通过man exec可查看 注意事项: 所有的exec类函数以 NULL结尾 表示完成 参数中后的...() { //第一个参数找到可执行程序 //后面的参数以列表形式(带l)告诉exec怎么执行 //以NULL结尾 execl("/bin/ps", "ps", "-ef", NULL); execl

10810
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【linux】进程等待与进程替换

    1,这时errno会被设置成相应的值以指示错误所在; 如果子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程退出信息。...当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。...调用exec并不创建新进程,所以调用exec前后该进程的id并未改变 替换函数 其实有六种以exec开头的函数,统称exec函数: #include ` int execl(const...错误处理和输出 子进程在 execl() 调用失败时通过 exit(1) 明确指示错误退出。...argv: 指向以 NULL 结尾的字符串数组的指针,这些字符串为要传递给新程序的命令行参数。 envp: 指向以 NULL 结尾的字符串数组的指针,这些字符串构成了新程序的环境。

    7610

    《Perl进阶》——读书笔记(更新至14章)

    eval 语句块有类似子例程的返回值(最后一行表达式求值,或者之前通过 return 返回的值)。...递归子例程有一个调用它本身的分支用于处理部分任务,以及一个不调用它本身的分支用于处理基线条件。...注意:类似Perl的动态语言无法自动将“尾递归”转为循环,因为再一次调用子例程之前,子例程定义可能改变。...来说,仅当程序超过1000行时(经验值),OOP的溢出才能显露出来 OOP书籍: 《Object Oriented Perl》Damian Conway(Manning出版社) 13.1 调用方法...,Perl的调用过程为: 构建参数列表 先尝试查找Class::method 在@ISA中按序找,比如:ISA[0]::method、ISA[1]::method、… 调用找到的方法,并将1中保存的参数列表传入

    4.8K50

    温故Linux后端编程(二):进程

    fork调用一次返回两次 父进程中返回子进程id (就是大于0的意思) 子进程返回0 读时共享写时复制,可保高效 与之相关函数: #include #include子进程后在子进程中exec来执行hello,达到父子进程分别做不同程序同时(宏观上)运行的效果。...结尾的字符串数组的指针,适合包含v的exec函数参数 char *arg[] = {"ls", "-a", NULL}; /** * 创建子进程并调用函数execl * execl...execve * v 希望接收到一个以NULL结尾的字符串数组的指针 * e 函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境 */ if( fork...waitpid调用一个组的所有子进程 >0 回收指定ID的子进程 */ //options: /* WNOHANG:强制回收,不阻塞。

    71120

    翻译:Perl代码审计:Perl脚本中存在的问题与存在的安全风险

    在没有正确验证的情况下,使用用户提供的参数执行其他程序,使最常见的错误。 system() 和exec()函数 Perl语言以其“粘贴语言”而出名,它可以出色地调用其他程序来帮协助完成它的工作。...通过收集一个程序的输出,以特定的方式重新格式化,并将其作为输入传递给其他程序,仔细地协调它们的活动,从而使一切都能顺利运行。 执行外部程序或系统命令的一种方法是调用exec()函数。...当Perl遇到exec()语句时,它会查看调用exec()时使用的参数,然后启动一个执行指定命令的新进程。Perl从不将控制权返回到调用exec()的原始进程。...另一个类似的函数是system(),system()与exec()函数非常相像。唯一的区别是perl首先从父进程中派生一个子进程。父进程等待着子进程结束,然后继续执行程序的其他部分。...Perl文档告诉我们: 如果文件名以“|”开头,则该文件名将被解释为将输出传输到的命令;如果文件名以“|”结尾,则该文件名将被解释为将输出传输到我们的命令。

    2.7K51

    《Perl语言入门》——读书笔记

    使用子程序调用的语法格式来调用,可不适用&符号来调用:func_name( @args ) 注意:建议只有在调用内置的时候省略&符号,其余的都加上&符号来区分调用的是内置还是自定义子程序。...当使用m时,匹配行末尾 \b:单词边界,即一组连续的\w字符开头或结尾 \G:上次匹配结束的位置 绑定操作符:=~ 默认情况下模式匹配的操作对象是_,绑定操作符告诉perl,拿右边的模式来匹配左边的字符串...; 如果调用chdir时不加参数,会回到自己的用户主目录,并试着将工作目录设成主目录。...my $now = ; # 开始执行并读取响应结果 print $mail_fh "the time is now $now"; # 写入邮件,假设$now以换行符结尾 注意:如果外部进程在连接到某个以读取模式打开的文件句柄后自行退出运行...当你关闭用来写入数据到某个进程的文件句柄时,该进程会读到文件结尾标识符。所以,要结束邮件的发送,只需要关闭这个文件句柄即可。

    2.5K20

    ABAP 模块化编程概念详解

    Function的导入参数 在IMPORTING块中,可使用导出参数访问调用结果 异常 在处理Function时出现应用程序错误(例如,值不适于计算), 函数模块就会提出相应的异常。...注意: 子例程中应避免使用主程序的变量,应使用参数 在子例程中定义的变量,只在子例程中有效 子例程的定义方式 子例程定义方式 子例程的定义方式: 以FORM开头、以 ENDFORM 结尾的...: 在主程序中定义的变量 这些变量在整个主程序和调用的每个子例程中均可见(可进行处理) 局部变量: 在子例程中定义的变量称作局部变量, 这些变量只存在于相关的子例程中(与形式参数相同),只能在子例程中使用...注意: 当全局变量和局部变量同名时,在子例程中局部变量起作用,而全局变量的值不改变。...在子例程中对全局变量的值进行修改以后,其修改的值仅存在于子例程中 子例程demo 无参数 *调用子例程 PERFORM FOR_DEMO1 . *无参数 FORM FOR_DEMO1 .

    1.6K21

    Linux进程控制——Linux进程程序替换

    ,子进程往往要调用一种exec函数以执行另一个程序。...当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。...操作系统在调用exec函数时,只要将整个进程的代码和数据用新程序的代码和数据进行替换。...13 printf("pid: %d, exec command end\n", getpid()); 其实是调用exec程序替换,只要exec替换新程序成功了,子进程就回去执行新的程序,因此后面的代码将不会被执行...return 0; } 在使用execlp函数时,我们并没有加上路径,但是我们依然能够获得想要的结果,正是因为p代表了PATH他会自动去环境变量

    9910

    浅析JavaScript正则表达式

    1.直接量定义(perl风格,本人较习惯用直接量):var reg = /exp/attributes   var pattern = /ccy$/;//匹配以ccy结尾的字符串; 注:同一段代码所表示的正则表达式每次运行时直接量会转换成不同的...6.指定匹配位置 正则表达式中匹配位置是一个难点 锚字符与断言 字符 含义 ^ 匹配字符串的开头,在多行检索中匹配一行的开头 $ 匹配字符串的结尾,在多行检索中匹配一行的结尾 \b 匹配一个单词的边界...仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如,/w+(?=/d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。 (?!=x) 零宽度负先行断言。...,会被exec(),test()方法用到 2.RegExp方法 exec() 执行字符串的匹配检索,类似String.match(),都会返回一个数组 test() 当调用exec方法返回不为null...则调用test方法返回为true

    1.6K30

    【Linux】详解进程程序替换

    一、替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。...当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。...替换系统命令时命令行怎么写,参数就怎么传,参数以NULL结尾。程序替换一旦成功,exec*后序的代码不再执行。因为原程序的数据和代码被替换掉了。exec*程序替换接口只有失败返回值,没有成功返回值。...二、子进程进行程序替换 通过子进程进行程序替换可以让子进程帮我们去做一部分工作,而且子进程发生程序替换不会影响父进程执行,因为替换时代码和数据会发生写时拷贝。...三、各种exec接口 其它六个接口在底层都封装了execve系统调用接口。 3.1、execlp   exec接口中,l意为list,表示参数列表,v意为vector,就指的是数组。

    9410

    Perl项目中的面向对象、继承默认加载和正则表达式的使用方法

    其次,基于array方法,在定义类时,我们将为每个实例属性创建一个数组,每个对象实例的本质是对这些数组中的行的索引的引用。在这些数组中,存储了所有实例属性。...Perl中可以使用任何名称。 可以使用各种Perl变量作为Perl对象。在大多数情况下,我们将使用引用数组或散列。 接下来,我们使用Perl哈希引用为Person类创建一个构造函数。...创建对象时,需要提供构造函数,这是一个返回对象引用的子例程。...如果找到AUTOLOAD,将调用它,并将全局变量$AUTOLOAD的值设置为缺少方法的完全限定名。 如果没有,Perl将声明失败和错误。...如果在析构函数返回之前重新祝福对象引用,Perl将在析构器返回之后调用重新祝福对象的DESTROY方法。这使有机会调用基类或指定的其他类的析构函数。

    1.8K40

    22 Java 正则表达式

    \d+|0[Xx][0-9A-Fa-f]+ 遗憾的是,在使用正则表达式的各种程序和类库之间,表达式语法并未完全标准化。尽管在基本结构上达成了一致,但是它们在细节上仍旧存在着许多令人抓狂的差异。...Java 正则表达式类使用的语法与 Perl 语言使用的语法十分相似,但是并不完全一样。表 1-8 展示的是 Java语法中的所有结构。...MULTILINE :^ 和 $ 匹配行的开头和结尾,而不是整个输入的开头和结尾。 UNIX_LINES :在多行模式中匹配 ^ 和 $ 时,只有 '\n' 被识别成行终止符。...参数:start 开始查找的索引位置 * int start() * int end() 返回当前匹配的开始索引和结尾之后的索引位置。 * String group() 返回当前的匹配。...* int start(int groupIndex) * int end(int groupIndex) 返回当前匹配中给定群组的开始和结尾之后的位置。

    42710

    深入思考 PyQt 多线程处理

    你傻啊,你要这样做的话,你在什么地方来判断这个标识变量呢?在 while 代码块开始的地方吗,还是在 while 代码块结尾的地方,或者是每一行语句中间都插一个判断的?...大概就是说,你写在 run() 里面的子线程处理逻辑,写完代码后要在最后面调用 exec() 这个方法,来让线程进入到循环等待中,避免线程运行完了直接结束掉。...在这个例程中,每个子线程的理论总运行时间应该为5秒,虽然在 1.5 秒时刻时就已经启动了子线程2,但由于子线程1的线程锁的作用,子线程2必须等待子线程1结束后才会启动;并且由于使用的是 quit/exit...方式来结束线程,因此必须等待子线程代码执行到 self.exec( ) 这一行时 quit/exit 才会起作用,因此子线程并没有在第2.5秒时就立即结束,而是执行完所有代码后才退出。...3.2 没有操作互斥资源的情况 上面那个例程虽然是最安全的,但显然不是用户体验最好的,因为第2.5秒时刻结束子线程,硬是等待第5秒后才退出,并且还继续打印输出,这在很多时候都是不太能接收的。

    7.7K60

    【Linux】进程控制

    而waitpid是系统调用,以操作系统身份执行代码,找到子进程,把传入的status传入子进程里面,把代码和退出信号设置进status,设置完毕之后把值输入status。...为例子: 对于替换函数,我们需要注意到:execl系列的函数结尾以NULL结尾 同时,这里为什么第二个printf输出语句没有执行?...替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数 以执行另一个程序。...当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动 例程开始执行。...printf也是代码,在exec之后,exec执行完毕之后代码已经全部被覆盖,开始执行新的代码,所以第二个printf就无法执行了。

    20030

    从零开始手写Shell:详解命令行解释器的实现原理

    execvp(g_argv[0], g_argv); exit(1); // exec失败时退出 } // 父进程等待 waitpid(id,...nullptr, 0); return 0; } 进程管理三剑客: fork()系统调用: 创建几乎完全相同的进程副本 返回两次:父进程返回子进程PID,子进程返回0 写时复制(Copy-On-Write...{ // 子进程分支 // 执行程序替换(注意argv必须以NULL结尾) execvp(g_argv[0], g_argv);...后续调用使用nullptr继续处理 自动构建与main()函数兼容的argv格式 进程管理引擎 Execute()实现经典fork-exec模型: 主控流程 典型REPL循环结构: while(true...\0分割字符串,返回每个token的起始地址 execvp特性 v:参数以数组形式传递(需NULL结尾) p:自动搜索PATH环境变量中的可执行文件 执行成功时替换当前进程映像,失败返回-1 waitpid

    9210

    exec族

    主进程为父进程,fork创建了子进程后在子进程中exec来执行hello,达到父子进程分别做不同程序同时(宏观上)运行的效果。...看一下后缀: 后缀 功能 l 希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志 v 希望接收到一个以NULL结尾的字符串数组的指针 p 是一个以NULL结尾的字符串数组指针,函数可以DOS的...结尾的字符串数组的指针,适合包含v的exec函数参数 char *arg[] = {"ls", "-a", NULL}; /** * 创建子进程并调用函数execl * execl...execle *l 希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志 *e 函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境 */...execve * v 希望接收到一个以NULL结尾的字符串数组的指针 * e 函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境 */ if( fork

    1.1K10

    SQL Server 2012学习笔记 (六) ------ SQL Server 存储过程和触发器

    它可以接受输入参数并以输出参数的格式向调用过程或批处理返回多个值;包含用于在数据库中执行操作(包括调用其他过程)的编程语句;向调用过程或批处理返回状态值,以指明成功或失败(以及失败的原因)。   ...3) 通过编程语言(例如,C)创建外部例程,并将这个例程在SQL Server中作为存储过程使用,这类存储过程称为扩展存储过程。   ...存储过程在创建时已经被编译,每次执行时不需要从新编译。而SQL语句每次执行都需要编译。   (4)存储过程具有安全特性(例如权限)和所有权链接,以及可以附加到它们的证书。...触发器是一个在修改指定表值的数据时执行的存储过程,不同的是执行存储过程要使用EXEC语句来调用,而触发器的执行不需要使用EXEC语句来调用,通过创建触发器可以保证不同表中的逻辑相关数据的引用完整性或一致性...当数据库中发生数据操作语言 (DML) 事件时将调用 DML 触发器。DML 事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。

    1.7K30

    【Linux进程控制】四、exec函数族——进程替换详解

    进程替换的概念 我们在使用fork()系统调用之后,创建出来的子进程是对父进程的复制,也就是说子进程和父进程执行的是相同的程序,虽然说父子进程可能执行的是不同的代码分支(if else语句),但是程序流程是一样...我们要想在新创建的子进程中执行其他程序,需要调用一种exec函数来拉起一个新的进程。当进程调用一种exec函数的时候,该进程的用户空间代码和数据全部被新程序替换掉,从新程序的启动例程开始执行。...需要注意的是,调用exec并不会创建新进程,而是一种进程替换,所以调用exec前后,进程本身的ID不会改变。...函数族的调用关系 我们在上面列出的5个exec函数最终都会调用execve系统调用,我们在查man手册的时候也能发现,上面5个在第3章,使用 man 3 execl 就可以把5个函数一块查到,而execve...实际上shell是先fork()一个进程,然后在fork()创建的子进程中使用exec函数来拉起一个其它进程,这样fork()后的两个进程有一个是shell进程,一个是我们需要执行的进程,这才是exec

    19110

    unix环境高级编程(中)-进程篇

    进程执行 进程执行从main函数开始,在这之前需要一些准备工作 内核使用exec函数调用c程序 执行c程序时,先调用一个特殊的启动例程。...2.2 vfork函数 功能类似与fork,区别如下: 区别一:vfork创建的子进程并不将父进程的地址空间完全复制到子进程中,子进程调用exec时,它在父进程的空间中运行,以提高效率(比前面说的COW...进程执行 6.1 exec说明 进程调用exec以执行另一个程序 调用exec时,该进程执行程序完全替换为新程序,新程序从main开始执行 调用exec并不创建新的进程,所以前后进程id不变 exec用一个全新的程序替换当前进程的正文...l要求每个参数单独传入,v要求传入参数数组 以e结尾的函数可以传递环境字符串指针 7. 解释器文件 在文本文件第一行添加 #! pathname,比如 #!...SIGSEGV:无效内存引用 信号的处理: 执行一个程序时,通常所有信号的状态都是系统默认 当调用exec时,将原先设置为要捕捉的信号都修改为默认(信号函数地址在新的进程可能无效) shell中执行后台进程时

    2.3K42
    领券