我有一个名为
test.c
的程序(不需要任何参数来启动,编译如下:
gcc test.c -o test
我想让我的其他程序执行
test
。
我知道我必须使用
execl()
但我就是无法理解 execl
函数中的参数。
execl( code here )
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
也不是不可能,就像 execle()
一样。 这不是一个很可能的问题,但 #define NULL 0
是合法的,如果 sizeof(int) == 4
但 sizeof(char *) == 8
,那么你可能会遇到困难。旁白:您可能会发现
execv*()
函数通常比 execl*()
函数更有用。 至少,我的经验是,我运行的程序比固定长度列表更经常需要可变长度参数列表。