execl()的参数传递给哪里?

时间:2017-05-26 17:21:46

标签: c++ c unix system-calls

在UNIX环境下的系统编程环境下,在使用编程语言C ++时,在我的理解中,execl()将传递它将运行的程序的路径,以及一个向量。当传入该向量时,我理解它被传递到入口点,这通常是主要功能。在主函数中,我理解我的参数可以写成:

int main(int argc, int* argv[]){ return 0; } 

考虑到上面的上下文,当参数传递给execl()时,在我看来它并没有直接传递给main函数。

是否有"处理"将execl()的参数更改为整数数据类型和数组的阶段?

与此同时,如果我的理解有任何缺陷,请随时纠正。

3 个答案:

答案 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; } 
                // ^^^^