execl(参数)的使用
Use of execl (Arguments)
C 新手。
所以我有一个名为 test.c 的程序(不需要任何参数来启动,像这样编译“
gcc test.c -o 测试")
我想让我的其他程序执行测试
我知道我必须使用 execl 但我无法理解 execl 函数中的参数
execl(此处为代码)
execle()
的所有参数除了最后两个都是字符串——倒数第二个是 null 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);
Ended up using execlp
and just writing execlp("./teste",NULL,NULL)
; only solution that worked.
令人印象深刻的是,一行简单的代码中可以有多少(小)问题。使用 execlp("./teste", NULL, NULL);
至少在这些方面是可疑的:
- 您没有为执行的程序提供名称,这充其量是无礼的,会导致无用的错误报告等。
- 如果您不打算提供名称,第一个 NULL 就足够了;第二个从未被处理。
- 使用
"./teste"
意味着永远不会执行execlp()
的p
(路径搜索)部分;你还不如使用 execle("./teste", (char *)NULL, environ);
.
NULL
在可变参数列表中不转换为 (char *)0
并非不可能,例如 execle()
。这不是一个很可能的问题,但 #define NULL 0
是合法的,如果 sizeof(int) == 4
但 sizeof(char *) == 8
,那么你可能会遇到困难。
旁白:您可能会发现 execv*()
函数通常比 execl*()
函数更有用。至少,我的经验是我 运行 的程序比固定长度列表更经常需要可变长度参数列表。
C 新手。 所以我有一个名为 test.c 的程序(不需要任何参数来启动,像这样编译“ gcc test.c -o 测试") 我想让我的其他程序执行测试 我知道我必须使用 execl 但我无法理解 execl 函数中的参数
execl(此处为代码)
execle()
的所有参数除了最后两个都是字符串——倒数第二个是 null 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);
Ended up using
execlp
and just writingexeclp("./teste",NULL,NULL)
; only solution that worked.
令人印象深刻的是,一行简单的代码中可以有多少(小)问题。使用 execlp("./teste", NULL, NULL);
至少在这些方面是可疑的:
- 您没有为执行的程序提供名称,这充其量是无礼的,会导致无用的错误报告等。
- 如果您不打算提供名称,第一个 NULL 就足够了;第二个从未被处理。
- 使用
"./teste"
意味着永远不会执行execlp()
的p
(路径搜索)部分;你还不如使用execle("./teste", (char *)NULL, environ);
. NULL
在可变参数列表中不转换为(char *)0
并非不可能,例如execle()
。这不是一个很可能的问题,但#define NULL 0
是合法的,如果sizeof(int) == 4
但sizeof(char *) == 8
,那么你可能会遇到困难。
旁白:您可能会发现 execv*()
函数通常比 execl*()
函数更有用。至少,我的经验是我 运行 的程序比固定长度列表更经常需要可变长度参数列表。