用fork 创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec 函数以执行另一个程序。当进程调用一种exec 函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec 并不创建新进程,所以调用exec 前后该进程的id并未改变。
exec函数可分了两大系列,主要的区别在于命令行参数的传递.
execl(const char* path,const char* arg,...);
execlp(const char* file,const char* arg,...);
execle(const char* path,const char* arg,...,const char* envp);
execv(const char* path,char*const argv[],...);
execvp(const char* file,char*const argv[],...);
execve(const char* path,char*const argv[],...,const char* envp);
第一个参数
无p的函数第一个参数要求的是程序的绝对路径或者相对路径如/bin/sh ,./sh
有p的函数第一个参数:
1:如果参数中包含/,则将其视为路径名。
2:否则视为不带路径的程序名,在PATH 环境变量的目录列表中搜索这个程序。
第二个可变参数
对于带l的函数可变参数是从左至右参数列表传递,而带v的就如我们的int main(int argc,int* argv[]),的第个参数般,是按指针数组传递的.
参数envp是代表环境变量.可以把一份新的环境变量表传给它,其
他exec 函数仍使用当前的环境变量表执行新程序。
事实上,只有execve是真正的系统调用,其它五个函数最终都调用execve
一个完整的例子:
#include <unistd.h>
#include <stdlib.h>
int main(void)
{
execlp("ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);
perror("exec ps");
exit(1);
}
执行此程序则得到:
$ ./a.out
PID PPID PGRP SESS TPGID COMMAND
6614 6608 6614 6614 7199 bash
7199 6614 7199 6614 7199 ps
由于exec
函数只有错误返回值,只要返回了一定是出错了,所以不需要判断它的返回值,直接在后面调用perror
即可。注意在调用execlp
时传了两个"ps"
参数,第一个"ps"
是程序名,execlp
函数要在PATH
环境变量中找到这个程序并执行它,而第二个"ps"
是第一个命令行参数,execlp
函数并不关心它的值,只是简单地把它传给ps
程序,ps
程序可以通过main
函数的argv[0]
取到这个参数。
分享到:
相关推荐
该程序是我写的博客“一起talk C栗子吧(第一百三十六回:C语言实例--exec系列函数二)”的配套程序,共享给大家使用
`exec`系列函数是用于替换当前进程映像的关键函数,使得进程能够执行新的程序。本文将深入解析`exec`系列函数的应用,结合提供的代码实例,帮助理解其工作原理和使用方法。 `exec`系列函数包括`execl`、`execle`、`...
本文将深入探讨两个重要的函数,`fork()`和`exec()`系列函数,它们在启动新进程时起着至关重要的作用。 **一、复制进程映像:fork()函数** `fork()`函数是Unix和类Unix系统(如Linux)中用于创建新进程的关键系统...
exec系列函数(如execl)用于在当前进程中替换执行另一个程序。在这个实验中,子进程使用execl调用/bin/sh,这意味着子进程的上下文被shell程序替换,从而执行shell命令。如果成功,exec调用不会返回,因此在execl...
`exec`函数族的基本工作原理是,当一个进程调用`exec`系列函数时,系统不会创建新的进程,而是将当前进程的内存空间清空,然后加载新的程序代码和数据。新程序会继承调用`exec`函数的进程的资源,如文件描述符、环境...
当`exec`系列函数成功执行时,调用它的进程会被新的程序替代,原进程的内存空间被新程序占用,而原来的程序代码和数据则被替换。 要理解这些示例代码的工作原理,你需要对C语言和Linux系统调用有一定的了解。`execl...
关于fork函数的介绍,和测试程序,原版fork linux平台
NX二次开发UF_DBC_MLD_exec_command 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业...
接着是`exec()`系列函数,如`execl()`, `execv()`, `execle()`, `execvp()`等,它们用于在已经存在的进程空间中加载并执行新的程序。`exec`家族的函数并不会创建新的进程,而是替换当前进程的内存映像,使其运行新的...
在Linux操作系统中,进程和线程编程是非常重要的概念,exec函数族是Linux中最基本的进程创建函数。exec函数族共有六种调用形式,都是以exec开头,后面的字母表示了用法上的区别。 exec函数族的六种调用形式 1. `...
这时,PHP提供了一系列内置函数,如`exec`、`system`、`passthru`和`escapeshellcmd`,允许我们调用系统命令。然而,这些功能强大的函数同时也伴随着潜在的安全风险,因此在实际应用中需谨慎使用。 `exec`函数用于...
如果`exec`系列函数执行成功,那么当前进程将被新的程序替换,不会继续执行后面的代码。在上述示例中,如果`execve`成功,"child id done"不会被打印出来,因为进程已经被新程序替换。如果`exec`失败,它会返回一个...
`exec`系列函数用于加载并执行新的程序,例如`execl()`、`execlp()`、`execv()`等,它们都用于替换当前进程的映像,执行指定的路径下的程序。不同之处在于参数的传递方式和是否搜索PATH环境变量。`_exit()`函数则...
此外,针对Linux系统,书中还详细讲解了与系统交互的函数,如fork用于创建子进程,exec系列函数用于执行新的程序,以及socket函数用于网络通信等。这些都是Linux开发中不可或缺的部分,对于理解和编写系统级程序至关...
此外,exec系列函数在C语言中用于执行外部文件,它们也涉及到可变参数的概念。值得注意的是,main()函数虽然不是典型的va函数,但其参数列表中包含了命令行参数的个数和指针,它也是与可变参数相关的函数。 可变...
进程控制是Linux系统编程的核心,`fork`函数创建子进程,`exec`系列函数(如`execl`, `execv`, `execle`, `execlp`, `execvp`)则用于替换当前进程的执行映像,加载新的程序。`wait`和`waitpid`用于父进程等待子进程...
在UNIX和Linux操作系统中,进程创建和控制是通过一系列系统调用来实现的,其中最常见的是`fork`、`exec`系列以及`system`和`popen`函数。这些调用各自有不同的特性和用途,理解它们的区别对于进行系统级编程至关重要...
在Linux操作系统中,进程是程序执行的实例。...需要注意的是,所有`exec`函数在成功执行后都不会返回,因为它们会替换当前进程而不是创建新的进程。在使用这些函数时,务必确保正确处理错误条件,以免程序意外终止。
在Node.js中,通常使用内置的`child_process`模块来执行外部命令,但`native-exec`模块则提供了更直接的方式来访问POSIX(可移植操作系统接口)的`exec*`函数系列,为开发者提供了更为底层的控制权。 POSIX `exec`...
7. **进程和线程管理**:fork用于创建子进程,exec系列函数替换进程地址空间执行新程序。pthread库提供了线程相关的API,如pthread_create创建线程,pthread_join等待线程结束。 8. **信号处理**:signal函数用于...