[英]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);
至少在这些方面是可疑的:
"./teste"
意味着execlp()
的p
(路径搜索)部分永远不会被执行; 你也可以使用execle("./teste", (char *)NULL, environ);
.NULL
在变量参数列表中不转换为(char *)0
并非不可能,例如execle()
。 这不是一个很可能的问题,但#define NULL 0
是合法的,如果sizeof(int) == 4
但sizeof(char *) == 8
,那么你可能会遇到困难。 旁白:您可能会发现execv*()
函数通常比execl*()
函数更有用。 至少,我的经验是,与固定长度列表相比,我运行的程序更经常需要可变长度参数列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.