我正在用 C 编写一个简单的 shell。它实际上与 i/o 重定向等配合得很好。我想添加的一件事是一种在 exec* 函数版本之间切换的方法。现在我坚持使用 execlp()、execvp() 和 execve()。
我有我想在一个名为 argv 的数组中传递的所有参数。它是一个空终止字符串的空终止数组,因此它可以与 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[]
)会产生关于强制转换不兼容指针的编译器错误。