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"
,这取决于您的口味。建议的三个程序名称选项中只有两个是彻头彻尾的谎言。如果将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);
至少在这些方面使用是可疑的:
"./teste"
意味着永远不会执行的p
(路径搜索)部分execlp()
;你还不如用过execle("./teste", (char *)NULL, environ);
.NULL
不转换为(char *)0
像 with 这样的变量参数列表并非不可能execle()
。这不是一个非常可能的问题,但是#define NULL 0
是合法的,如果sizeof(int) == 4
但是sizeof(char *) == 8
,那么您可能会遇到困难。另外:您可能会发现这些execv*()
函数通常比函数更有用execl*()
。至少,我的经验是,我运行的程序比固定长度列表更经常需要可变长度参数列表。