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); 至少在这些方面是可疑的:

  1. 您没有为执行的程序提供名称,这充其量是无礼的,会导致无用的错误报告等。
  2. 如果您不打算提供名称,第一个 NULL 就足够了;第二个从未被处理。
  3. 使用"./teste"意味着永远不会执行execlp()p(路径搜索)部分;你还不如使用 execle("./teste", (char *)NULL, environ);.
  4. NULL 在可变参数列表中不转换为 (char *)0 并非不可能,例如 execle()。这不是一个很可能的问题,但 #define NULL 0 是合法的,如果 sizeof(int) == 4sizeof(char *) == 8,那么你可能会遇到困难。

旁白:您可能会发现 execv*() 函数通常比 execl*() 函数更有用。至少,我的经验是我 运行 的程序比固定长度列表更经常需要可变长度参数列表。