我在C中编写一个简单的shell。它实际上与i / o重定向等相当好。我想补充的一件事是在exec *函数的版本之间切换。现在我坚持使用execlp(),execvp()和execve()。
我想要在名为argv的数组中传递所有参数。它是一个以null结尾的空终止字符串数组,因此它可以与execv *一起使用,但我想不出如何使用execlp()。
这就是我现在所拥有的:
if (strcmp(exec_opt, "vp") == 0)
error = execvp(argv[0], argv); /* Execute vp */
else if(strcmp(exec_opt, "lp") == 0)
error = execlp(argv[0], "", argv); /* Execute lp */
else if(strcmp(exec_opt, "ve") == 0)
error = execve(argv[0], argv, environ); /* Execute ve */
else
{
// throw errors about exec_opt
}
if(error != 0)
{
// do something about it
}
在此配置中,编译器不会对语法产生影响,但它也不起作用。 我也试过了
error = execlp(argv[0], (char*) argv); /* As a single string */
char* argv1 = argv[1]; /* don't pass command itself */
error = execlp(argv[0], argv1);
各种奇怪但最终不正确的事情。有没有办法让我把我的数组变成一个变量参数列表?直接传递它(因为变量参数列表是char* argv[]
,因此它具有最大的类型意义)会产生关于转换不兼容指针的编译器错误。
答案 0 :(得分:0)
您无法在阵列中使用execlp()
。要使用execlp()
,您必须写出:
execlp(array[0], array[0], (char *)0);
execlp(array[0], array[0], array[1], (char *)0);
execlp(array[0], array[0], array[1], array[2], (char *)0);
execlp(array[0], array[0], array[1], array[2], array[3], (char *)0);
...
为每个替代数量的参数。这就是为什么execvp()
被添加到曲目中的原因(1978年它不是7th Edition UNIX™的一部分,而是1997年SUS v2的一部分)。现在你只需要execvpe()
,它不存在AFAIK(我不知道为什么它没有提供)。
excevp()
第7版手册列出了
execvp
。
而且......确实如此。我认为我们有一个错误报告,因为手册实际上包含:
NAME
execl,execv,execle,execve,execlp,execvp,exec,exece,environ - 执行文件
概要
execl(name, arg0, arg1, ..., argn, 0) char *name, *arg0, *arg1, ..., *argn; execv(name, argv) char *name, *argv[ ]; execle(name, arg0, arg1, ..., argn, 0, envp) char *name, *arg0, *arg1, ..., *argn, *envp[ ]; execve(name, argv, envp); char *name, *argv[ ], *envp[ ]; extern char **environ;
描述
因此,execvp()
列在NAME部分,但没有execvp()
的概要(这是我看到的结论,它缺少了)。在下一页上有execvp()
的引用:
使用与 execl 和 execv 相同的参数调用Execlp 和 execvp ,但复制shell的操作在目录列表中搜索可执行文件。目录列表是从环境中获取的。
所以,我原谅自己是因为我扫描了大纲,并且在概要中省略了execvp()
。但实际上,系统调用存在于第7版Unix中。我认为任何人都不会重新发布手册,并且省略了修改。
我的打印副本(是的,我做打印了第1卷(ISBN 0-03-061742-1)和第2卷(ISBN 0-03-061743-X)的正确绑定版本从那时开始的手册;我在大约1989年获得它们)在概要部分中有相同的遗漏。
答案 1 :(得分:0)
尝试使用avcall。我自己没有使用它,我在这里发现了一个有趣的提及:Passing parameters dynamically to variadic functions