C的新手。 因此,我有一个名为test.c的程序(不需要任何参数即可启动,像这样编译: gcc test.c -o test”) 我想让我的其他程序执行测试 我知道我必须使用execl,但我无法理解execl函数中的参数
execl(此处的代码)
答案 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);
值得怀疑:
"./teste"
意味着从不执行p
的{{1}}(路径搜索)部分;您可能还使用过execlp()
。execle("./teste", (char *)NULL, environ);
不会像NULL
那样在可变参数列表中不转换为(char *)0
。这不是一个很可能的问题,但是execle()
是合法的,如果#define NULL 0
但sizeof(int) == 4
,那么您可能会遇到困难。此外:您可能会发现sizeof(char *) == 8
函数通常比execv*()
函数更有用。至少,我的经验是,我运行的程序比固定长度列表更经常需要变长参数列表。