据此关联,我们需要通过空指针终止参数列表。这被表述为:
参数列表必须以空指针终止。
我的问题是为什么我们需要通过空指针终止参数列表?使用它是因为要知道参数列表的末尾,这是一个指向 char 指针的数组吗?
答案1
为什么我们需要用空指针来终止参数列表?使用它是因为要知道参数列表的末尾,这是一个指向 char 指针的数组吗?
是的。环境变量数组也是如此。内核需要以某种方式知道要从调用进程复制多少数据,并且系统调用不会为这些数组中的元素数量提供显式参数。 (将其作为明确的参数传递当然也可以。)
答案2
所以,首先,没有exec()
系统调用。exec()
是用于引用一系列相关 API 的符号:execve()
系统调用和一组库函数位于该系统调用之上。库函数提供了通常有用的小型 API 变体。
一些的库函数l
--函数名后缀带有--是可变参数函数。它们允许您指定将作为列表执行的程序的命令行参数(随意的长度)在函数调用中。该列表末尾的空指针允许函数确定该列表的末尾在哪里。 (这些参数的存储位置取决于实现。请参阅函数的 va_arg 参数存储在堆栈内存还是堆内存中?)
库函数在内部分配一个argv
正确大小的数组,并用指向字符串的指针填充该数组(并添加 aNULL
作为该数组的最后一个元素argv
)。然后(最终)将构造的内容argv
传递到对 的调用中execve()
。