Linux 中的 exec() 系统调用

Linux 中的 exec() 系统调用

据此关联,我们需要通过空指针终止参数列表。这被表述为:

参数列表必须以空指针终止。

我的问题是为什么我们需要通过空指针终止参数列表?使用它是因为要知道参数列表的末尾,这是一个指向 char 指针的数组吗?

答案1

为什么我们需要用空指针来终止参数列表?使用它是因为要知道参数列表的末尾,这是一个指向 char 指针的数组吗?

是的。环境变量数组也是如此。内核需要以某种方式知道要从调用进程复制多少数据,并且系统调用不会为这些数组中的元素数量提供显式参数。 (将其作为明确的参数传递当然也可以。)

答案2

所以,首先,没有exec()系统调用。exec()是用于引用一系列相关 API 的符号:execve() 系统调用和一组库函数位于该系统调用之上。库函数提供了通常有用的小型 API 变体。

一些库函数l--函数名后缀带有--是可变参数函数。它们允许您指定将作为列表执行的程序的命令行参数(随意的长度)在函数调用中。该列表末尾的空指针允许函数确定该列表的末尾在哪里。 (这些参数的存储位置取决于实现。请参阅函数的 va_arg 参数存储在堆栈内存还是堆内存中?

库函数在内部分配一个argv正确大小的数组,并用指向字符串的指针填充该数组(并添加 aNULL作为该数组的最后一个元素argv)。然后(最终)将构造的内容argv传递到对 的调用中execve()

相关内容