execl的使用(参数)

时间:2018-11-11 01:53:05

标签: c execl

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

execl(此处的代码)

1 个答案:

答案 0 :(得分:1)

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的{​​{1}}(路径搜索)部分;您可能还使用过execlp()
  4. execle("./teste", (char *)NULL, environ);不会像NULL那样在可变参数列表中不转换为(char *)0。这不是一个很可能的问题,但是execle()是合法的,如果#define NULL 0sizeof(int) == 4,那么您可能会遇到困难。

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