繁体   English   中英

execl 的使用(参数)

[英]Use of execl (Arguments)

C 的新手。所以我有一个名为 test.c 的程序(不需要任何参数来启动,像这样编译“gcc test.c -o test”)我想让我的另一个程序执行测试我知道我必须使用 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" 建议的三个程序名称选项中只有两个是彻头彻尾的谎言。 如果你用(char **)0或等价物替换environ参数,那么程序将在没有环境变量的情况下被调用,这通常被认为是对正在运行的程序的滥用(而不是告诉它它的名字是“ 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"意味着execlp()p (路径搜索)部分永远不会被执行; 你也可以使用execle("./teste", (char *)NULL, environ); .
  4. NULL在变量参数列表中不转换为(char *)0并非不可能,例如execle() 这不是一个很可能的问题,但#define NULL 0是合法的,如果sizeof(int) == 4sizeof(char *) == 8 ,那么你可能会遇到困难。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM