我正在使用一个简单的Linux Shell,它可以fork()并调用execvp(),但我最近添加了#34;内置函数"哪个不需要fork()。
这是执行处理:
if (strcmp(cmd, "exit") == 0) {
exit = 1;
}
else if (builtIn(opt) == 0){
execvp(cmd, opt);
}
else {
pid_t pID = fork();
if (pID == 0) {
execvp(cmd, opt);
} else if (pID < 0) {
printf("\nFailed to fork\n");
} else {
wait(0);
}
}
builtIn()只检查命令并返回1或0:
int builtIn(char * opt[]) {
if (strcmp(opt[0], "cd")) {
return 1;
}
return 0;
}
答案 0 :(得分:2)
你需要避免分叉,但你也需要避免执行。程序调用更改目录没有/bin/cd
。
不要执行某些操作,而是使用您的路径调用chdir
系统调用。如果用户输入cd /tmp
,请致电chdir("/tmp")
当前目录是每个进程的属性(作为打开文件或umask值)您无法调用程序来更改当前目录,作为程序是一个不同的进程,将有效地更改其目录(而不是您的目录)。这就是不存在cd外部命令并且必须进行系统调用以更改它的原因。
答案 1 :(得分:1)
除了路易斯回答。即使/ bin中有一个程序cd,它也不会工作,因为每个进程都有自己的pwd(当前工作目录),因此它将更改cd程序的pwd而不是其父程序main shell。