2017-05-26 86 views
0

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

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

考虑到上述背景下,当参数被传递到execl的(),在我看来,它并没有得到直接传入主函数。

是否有一个“处理”阶段的execl()的参数更改为整数数据类型和数组?

同时,如果我的理解有任何问题,请随时纠正。

+2

你声称的主要特征是错误的,ITT的总是'INT主(INT ARGC,CHAR * argv []){return 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

不要忘了施放'NULL'(char *)NULL' –

+0

@SeekAddo好。编辑。 – dbush

1

main需要char*argv[]参数(不是int *argv[])就像通常的核心执行sysccall通常一样。在Linux上,系统调用是execve(需要一个char*[])并且所有其他exec *函数都是以这种方式实现的。

至于execl,参数列表需要以NULL结尾,它允许您计算参数,然后将它们复制到传递到execve的数组中。

的MUSL libc库的确是相当直截了当:https://git.musl-libc.org/cgit/musl/tree/src/process/execl.c

1

你的理解是错误的。从这个documentation参数列表始终是一些空值终止char*指针(重点煤矿):

execl(<shell path>, arg0, file, arg1, ..., (char *)0);

其中,是SH公用未指定的路径,文件是>>过程图像文件和execvp(),其中arg0,arg1等与传递给argv [0],argv [1]等中的execvp()的值相对应。

由arg0,...表示的参数是指向以空字符结尾的字符串的指针。这些字符串应构成可用于新过程映像的参数列表。该列表由空指针终止。参数arg0应该指向与某个exec函数启动的进程关联的文件名字符串。

所以不符合你自称什么:

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