首页 > 解决方案 > execl 的使用(参数)

问题描述

C 的新手。所以我有一个名为 test.c 的程序(不需要任何参数来启动,像这样编译“gcc test.c -o test”)我想让我的其他程序执行测试我知道我必须使用 execl但我只是无法理解 execl 函数中的参数

execl(代码在这里)

标签: cexecl

解决方案


除了最后两个之外,所有参数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);至少在这些方面使用是可疑的:

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

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


推荐阅读