在UNIX环境下的系统编程环境下,在使用编程语言C ++时,在我的理解中,execl()将传递它将运行的程序的路径,以及一个向量。当传入该向量时,我理解它被传递到入口点,这通常是主要功能。在主函数中,我理解我的参数可以写成:
int main(int argc, int* argv[]){ return 0; }
考虑到上面的上下文,当参数传递给execl()时,在我看来它并没有直接传递给main函数。
是否有"处理"将execl()的参数更改为整数数据类型和数组的阶段?
与此同时,如果我的理解有任何缺陷,请随时纠正。
答案 0 :(得分:3)
您为main
功能提供的签名不正确。它应该是:
int main(int argc, char *argv[]);
或者:
int main(void);
对于参数,传递给execl
的参数应该与被调用程序接收的参数匹配。
例如,如果程序A执行程序B,则执行以下操作:
execl("/path/to/progB", "progB", "-a", "1", "-x", "hello", "command", (char *)NULL);
然后在B计划中,argc
将为6,argv
将基本为:
{ "progB", "-a", "1", "-x", "hello", "command" }
答案 1 :(得分:1)
main
采用char*argv[]
参数(不是int *argv[]
)就像通常的核心exec sysccall通常那样。在Linux上,系统调用是execve
(需要char*[]
),所有其他exec *函数都是以此为基础实现的。
对于execl
,参数列表必须以NULL结尾,这允许您对参数进行计数,然后将它们复制到一个传递给execve
的数组中。
musl libc库非常直接地做到了这一点:https://git.musl-libc.org/cgit/musl/tree/src/process/execl.c
答案 2 :(得分:1)
你的理解是错误的。从这个documentation开始,参数列表始终是一些以空值终止的char*
指针(强调我的):
execl(<shell path>, arg0, file, arg1, ..., (char *)0);
其中是sh实用程序的未指定路径名,文件是&gt;&gt;进程映像文件,对于execvp(),其中arg0,arg1等对应于传递给argv [0],argv [1]等中的execvp()的值。
arg0,...表示的参数是以null结尾的字符串的指针。这些字符串应构成新过程映像可用的参数列表。该列表由空指针终止。参数arg0应指向与其中一个exec函数启动的进程相关联的文件名字符串。
这与你声称的内容不相符:
int main(int argc, int* argv[]){ return 0; } // ^^^^