我打算在Ubuntu上用C编写一个简单的shell。
我想过使用exevcp()
函数。
我只能运行“ls”命令,其他命令似乎都不起作用。
有人可以告诉我它为什么会发生,或者让我知道一个更好的构建shell的方法吗?
我的目的是建立这个shell;我不明白为什么我不能只使用命令行,并将其原样放入execvp()
函数。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int main(int argc,char **argv,char **envp)
{
char* args[] = {"history" , NULL};
execvp(args[0],args);
}
你能解释一下吗?
答案 0 :(得分:3)
exec(3)
只能用于运行外部程序。 history
是大多数shell中内置的,不能以这种方式运行。
答案 1 :(得分:1)
execvp()
系统调用有两个参数:要执行的程序的名称,以及指向以空值终止的字符串列表的指针,这些字符串是命令的参数。
例如:
char *args[] = { "ls", "-l", "-t", "-r", ".", 0 };
execvp(args[0], args);
...report error...
您不能简单地将整个字符串传递给execvp()
并期望将其拆分;调用代码必须这样做。请注意,如果execvp()
的第一个参数指向的字符串包含斜杠,则$PATH
机制不用于查找命令。使用"ls"
搜索普通名称(如图所示$PATH
)。
您还必须记住,某些命令(例如history
和cd
)是shell内置函数;没有外部可执行文件可以运行以获得相同的效果您将无法运行它们。其他命令,例如test
(又名[
)通常作为内置函数实现,但通常还有/bin
或/usr/bin
中的二进制文件(或多或少) )同样的工作,你可以调用它。