学生壳 - 光盘不工作

时间:2014-12-11 19:15:26

标签: linux shell exec fork cd

我正在使用一个简单的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;
}

2 个答案:

答案 0 :(得分:2)

你需要避免分叉,但你也需要避免执行。程序调用更改目录没有/bin/cd

不要执行某些操作,而是使用您的路径调用chdir系统调用。如果用户输入cd /tmp,请致电chdir("/tmp")

当前目录是每个进程的属性(作为打开文件或umask值)您无法调用程序来更改当前目录,作为程序是一个不同的进程,将有效地更改其目录(而不是您的目录)。这就是不存在cd外部命令并且必须进行系统调用以更改它的原因。

答案 1 :(得分:1)

除了路易斯回答。即使/ bin中有一个程序cd,它也不会工作,因为每个进程都有自己的pwd(当前工作目录),因此它将更改cd程序的pwd而不是其父程序main shell。