C新手。因此,我有一个名为test.c的程序(不需要任何参数即可启动,编译如下(gcc测试。c-o测试"(我想让我的其他程序执行测试我知道我必须使用execl,但我就是无法理解execl函数中的参数
execl(此处编码(
除最后两个参数外,execle()
的所有参数都是字符串——倒数第二个参数是空char *
,标记命令行参数的末尾,最后一个参数是指定环境的char **
。第一个是可执行文件的路径名,如果名称不是以/
斜线开头,则相对于当前目录。第二个参数是程序的名称。后续参数是程序的额外参数(列表由(char *)0
参数终止(,然后是程序的环境的最后一个参数(后面的e
表示环境已传递(。因此,例如:
extern char **environ; // No header declares this!
execle("teste", "pink elephants", (char *)0, environ);
你可以用"teste"
或"/bin/bash"
代替"pink elephants"
,这取决于你的口味。建议的三个程序名称选项中只有两个是彻头彻尾的谎言。如果将environ
参数替换为(char **)0
或等效参数,则调用该程序时不使用环境变量,这通常被视为对正在运行的程序的滥用(就像告诉它它的名称是"pink elephants
"而不是"teste
"是对它的滥用(。
你也可以使用变量:
const char *progname = "teste";
execle(progname, progname, (char *)0, environ);
最终使用了
execlp
,只写了execlp("./teste",NULL,NULL)
;唯一有效的解决方案。
令人印象深刻的是,在一行简单的代码中可以有这么多(小(问题。使用execlp("./teste", NULL, NULL);
至少在以下方面是可疑的:
- 您没有向执行的程序提供其名称,这充其量是不礼貌的,并导致无益的错误报告等
- 如果您不打算提供名称,那么第一个NULL就足够了;第二个永远不会被处理
- 使用CCD_ 17意味着CCD_ 19的CCD_;您还不如使用CCD_ 20
NULL
不可能像execle()
那样在变量参数列表中转换为(char *)0
。这不是一个很可能的问题,但#define NULL 0
是合法的,如果sizeof(int) == 4
而不是sizeof(char *) == 8
,那么你可能会遇到困难
此外:您可能会发现execv*()
函数通常比execl*()
函数更有用。至少,我的经验是,与固定长度的列表相比,我运行的程序更需要可变长度的参数列表。