“ cd”命令在我的自定义外壳中不起作用

时间:2019-12-04 19:13:20

标签: c linux shell ubuntu

cd命令有问题。其他所有内容似乎都可以正常工作,例如编译和运行程序以及ls。我运行lsls -1并正常工作。当我运行cdcd Desktop时,什么也没发生。

我正在创建一个fork,然后执行一个过程。我以exit退出或按 CTRL + D

代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>

#define SIZE 255

void printPrompt(){

    printf("\nuser@shell > ");   //print prompt

}

void readPrompt(char string[],int *check){   //read prompt line from user

    if( (scanf(" %[^\n]",string)==EOF) ){
        //printf("\nTEST\n");
        *check=0;
    }
    printf("\n");
}

void RunSimple(char line[]){    //creating a fork and running a program with exe fuction. 

    char **args=malloc(8 * sizeof(char *));
    char *parsed;
    int i=0,pid;

    parsed = strtok(line," ");

    while (parsed != NULL) {
        args[i] = parsed;
        i++;

        parsed = strtok(NULL," ");
    }

    pid = fork();

    if(pid == 0){
        execvp (args[0],args);
    }

    waitpid(pid,NULL,0);
}

int main(int argc, char **argv){

    char line[SIZE];
    int check=1;

    while(1){

        printPrompt();
        readPrompt(line,&check);

        if( (!strcmp(line,"exit")) || (check==0) ){
            break;
        }

        RunSimple(line);
    }
}

谢谢。

1 个答案:

答案 0 :(得分:1)

cd必须作为内置函数实现,因为当前工作目录是该进程的属性。因此,您的cd命令必须更改外壳程序的状态,这是子进程无法完成的。还有其他一些事情,例如环境变量的处理,必须要这样处理。