Execve()函数用于执行路径名所指的程序。exec家族主要用于C编程语言,有许多函数。这些函数在一个独立于主程序的进程中执行系统命令并打印输出。在这篇文章中,我们将讨论exec家族的一些主要功能,主要是execve功能,并举一些基本的例子。
现在让我们来看看所附图片中的exec家族。这张图显示了exec家族所有可能的函数的语法。
语法
从C语言中exec家族的每个名字中,你可以观察到每个函数的基础是exec(execute),后面还有一个或多个字母/字母。
e:'e'字母表示一个指向环境变量的指针数组,它被传递给新进程以覆盖前一个进程。
**l:**这个字母表示单独或以列表形式传递给函数的'命令行参数'。
**P:**它利用环境中的路径变量,用来在文件参数中寻找文件的名称,这样就可以被执行。
**V:**与'l'类似,命令行参数以向量数组或指针数组的形式传递给相关函数。
从上面提到的图像中,你已经看到,每个函数都使用一些特定的参数作为参数。我们将在这里对它们进行解释,以展示每个函数的工作情况。
路径
这个参数显示的是执行新进程的文件路径名称。那些从arg0开始的参数指针指向要传递给新创建进程的参数。argv的值是一个指向参数的指针数组。
arg0
第一个参数arg0必须是可编辑文件的名称。一些程序不能正确依赖这个参数,因为他们提供了错误的可执行文件的位置。但我们不能保证这一点,因为它不是exec家族平台的基准。
Envp
这个参数envp是一个指向环境设置的指针数组。被称为exec()的系统,其名称以字母'e'结尾,用于改变新进程的环境。这是通过 envp 参数传递环境设置的列表来完成的。这就是这个参数如何帮助exec系统调用的。这个参数是一个带有字符指针的数组,换句话说,是一个字符数组。数组中的每个元素都指向一个空尾的字符串,该字符串定义了一个环境变量。
Execve ()
execve函数主要用于涂抹(overlay)一个因为调用fork()而运行的进程。这使得当前正在运行的程序被调用它的进程替换成另一个新的程序,涉及到一个新初始化的堆、栈和其他数据段。Execve()执行由文件名分配的程序。文件名必须是以带有 "#"的一行开头的脚本或二进制可执行文件。
execve()的作用
当进行execve系统调用时,一个文件描述符打开,并在新进程中保持开放,直到被fcntl关闭。这方面用于指定新程序的标准流,如stdin、stdout和stderr。当新进程的叠加成功后,那么之前的方法的内存地址空间和所有没有被共享的内存区域被隔离并再次返回给操作系统。同时,未与新程序共享的数据也会丢失。
execve()的返回值
当execve()被成功处理时,它并不返回值。成功的exec取代了当前的进程,不能向通过调用的程序返回任何东西。这些进程也有一个退出状态,但父进程会收集这个值。如果execve向被调用的舞会返回东西,意味着发生了错误,返回值为-1。而errno包括E2BIG、ENOMEM、EACCES这样的值。这些错误发生在参数列表超过系统限制的时候。没有足够的内存可以执行新进程,或者相关文件违反了共享和锁定的规则。
execve()的实现
我们实现了Ubuntu Linux操作系统的源代码来分享一些例子。用于演示的工具包括一个文本编辑器,而对于输出,我们使用了Ubuntu终端。
例子1
首先,我们使用了一个库,其中包括所有exec函数的执行信息。
# 包括<uninstd.h>
然后在主程序中,提供了一个二进制路径,然后将其作为常量参数。参数中的其他参数包括主机名和端口号。常量环境由网站地址组成。在使用execve系统调用时,二进制路径、参数和环境变量被作为参数使用。
我们使用gcc编译器来编译代码。
$ gcc-oexecexec. c
编译后,使用下面写的命令。
$ . /exec
"Exec.c "是文件的名称。
其结果值如下所示。它将包括包含环境变量中的主机名和端口号的常量参数。
例2
与前面的例子不同,这里我们有两个文件的参与。一个是只包含显示信息的exec文件。用".c "扩展名保存该文件,以创建一个可执行文件。
$ gccEXEC.c -o EXEC
之后,创建另一个名为 "sample.c "的演示文件。在它里面写一段C代码,有一个exec()函数。在主程序中,在引入参数时,我们调用我们创建的文件名 "EXEC.c"。然后,通过对execve()函数的调用,将该调用作为一个参数。然后打印一个语句 "结束..."。这个printf命令只有在 "EXEC.c "文件没有被成功执行时才会被执行;当execve()被调用时,所有写在它后面的语句都被忽略了。进程'sample.c'被替换成 "EXEC.c"。
现在执行其余的命令。你会看到,通过执行 "sample.c "文件,显示了 "EXEC.c "的语句。这个例子是C语言中execve()的一个优秀范例。
总结
C语言:execve函数用法》这篇文章包含了对exec函数家族中所有元素的一些基本描述。我们在一些基本例子的帮助下详细解释了execve的功能。这里还讨论了在描述和声明execve函数时起重要作用的参数。