- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
例如execve(2),根据 posix,它具有以下原型(prototype) [1]:
int execve(const char *path, char *const argv[], char *const envp[]);
对我来说,好像
int execve(const char *path, const char *const argv[], const char *const envp[]);
会是一个明显的改进。
所以,有人知道为什么会这样吗?什么可以解释需要可能操纵给定的 argv/envp 字符串?
[1] http://pubs.opengroup.org/onlinepubs/009695399/functions/exec.html
最佳答案
execve()
的 argv
和 envp
参数不是指向 const
的指针,以便向后保存与在 const
添加到 C 之前编写的有效 C 代码的兼容性。
C首次出现in 1972 .后来,const
被添加到 C in 1987.
为了保持与 pre-const
代码的兼容性,execve()
的 updated-with-const
声明必须能够接受非 const
输入。 C 不允许从 char *[]
到 const char *[]
的赋值。这可以通过尝试(并且失败)编译以下程序来验证:
void foo ( const char * argv[] ) { return; }
void main ( int argc, char * argv[] ) { foo ( argv ); }
因此,char *const[]
是向后兼容 pre-const
代码的最严格的类型。
该问题提供了指向 execve()
的 POSIX 文档的链接。链接的 POSIX 文档对此进行了如下解释:
The statement about
argv[]
andenvp[]
being constants is included to make explicit to future writers of language bindings that these objects are completely constant. Due to a limitation of the ISO C standard, it is not possible to state that idea in standard C. ...
实际上,准确地说:不可能以与const
之前的代码向后兼容的方式来陈述这个想法。
... Specifying two levels of
const
- qualification for theargv[]
andenvp[]
parameters for the exec functions may seem to be the natural choice, given that these functions do not modify either the array of pointers or the characters to which the function points, but this would disallow existing correct code. Instead, only the array of pointers is noted as constant. The table of assignment compatibility for dst= src derived from the ISO C standard summarizes the compatibility:dst: char *[] const char *[] char *const[] const char *const[]
src:
char *[] VALID - VALID -
const char *[] - VALID - VALID
char * const [] - - VALID -
const char *const[] - - - VALIDSince all existing code ...
意思是在 const
被添加到 C 之前存在的所有代码。
... has a source type matching the first row, the column that gives the most valid combinations is the third column. The only other possibility is the fourth column, but using it would require a cast on the
argv
orenvp
arguments. It is unfortunate that the fourth column cannot be used, because the declaration a non-expert would naturally use would be that in the second row.
来源:2018 edition , 2004 edition .
关于process - 为什么 execve 的 argv 和 envp 参数不指向 const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26380535/
我想知道缩写 envp 代表什么,例如这里: int main(int argc, char **argv, char **envp); 我还想知道 argv 中的 v 最初代表什么。 v 是“值”吗
我用 Visual Studio 创建了一个 VC++ 控制台项目,它自动生成了这个函数: int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { .
我正在尝试使用 setenv() 设置新的环境变量。 但我注意到 setenv() 函数仅在我使用环境“extern char **environ”时设置我的新环境变量 但我想使用 main() 的参
在FastCGI中,有一个struct FCGX_Request的指针envp。这是代码: typedef struct FCGX_Request { int requestId;
我的问题是我不理解某一行代码 当这个 envp 参数出现在 main 上时,我正在对一个 crackme 进行逆向工程,然后程序开始使用它,这让我不明白如何解决 crackme 的第二部分(我正在使用
我已经使用以下命令设置了一个环境变量: QUERY_STRING='This is my query string' 这是我的程序: #include #include void main (in
为了在 C 程序中获取环境变量,可以使用以下方法: getenv() extern char **environ; 但除了上面提到的以外,是否使用 char *envp[] 作为 main() 的第三
我学习 BPF 是为了自己的乐趣,我很难弄清楚如何从传递给我的 eBPF 程序的上下文中读取 argv 和 envp sys_enter_execve 我将在这里展示我的 BPF 程序,然后在稍后更详
我编写了一个程序来计算传递给 execve 系统调用的参数的总大小。 我已经用最大参数大小测试了这个程序,预计“Argument list too long”错误只会在超过 ARG_MAX 限制时发生
例如execve(2),根据 posix,它具有以下原型(prototype) [1]: int execve(const char *path, char *const argv[], char *
我正在将 C 程序链接到 NASM 可执行文件。汇编文件调用链接的C程序中的main函数 virus: infect.c virus.o $(CC) $(LFLAGS) $^ -o $@ v
int execle(const char *path, const char *arg, ..., char * const envp[]); 在Linux中使用的上述函数原型(prototype)
背景: 我知道出于安全原因,带有 setuid 的父程序不能将 LD_LIBRARY_PATH 保留为 env 的一部分,因此任何子进程也不会“看到”LD_LIBRARY_PATH。 上下文: 我的父
我是一名优秀的程序员,十分优秀!