C中shell的低级代码,需要能够使用getcwd()、getenv()和chdir()更改目录

pgx2nnw8  于 2022-12-11  发布在  Shell
关注(0)|答案(1)|浏览(126)

我正在做一个项目,我需要创建一个能够在目录之间切换并连续输出当前目录的shell,这与Linux中的正常情况完全相同。
下面是我目前拥有的代码

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

#define BUFFERSIZE 1024

int main(int argc, char* argv[])
{
    char buf[BUFFERSIZE];
    int n;
    printf("1730sh:~$ \n");
    while ((n = read(STDIN_FILENO, buf, BUFFERSIZE)) > 0)
    {
        buf[n] = 0;
        buf[strlen(buf)-1] = '\0';
        int i = 0;
        char* array[10];
        char* token1 = strtok(buf, " ");
        char* newarray[10];
        int exitIndicator = 0;
        char* directOut;
        char* directory;

        while ((token1 != NULL))
        {
            array[i++] = token1;
            token1 = strtok(NULL, " ");
        }//while

        array[i] = NULL;
        for (int j = 0; j < i; j++)
        {
            if (!strcmp(array[j], "cd"))
            {
                directory = array[j+1];
                int change = chdir(directory);
                exitIndicator = 1;
            }
        }
        printf("1730sh:~%s$ \n", directory);
    }
}

这段代码的问题是,在从头更改目录后,如果我输入另一个命令并运行它,它会返回到其主目录。
Ps:在完整的代码中,cat file1. txt像它应该的那样工作,所以只需假设它工作,输出它应该的东西。

./main
1730sh:~$ 
cd Ghioalda-Edward-p3
1730sh:~Ghioalda-Edward-p3$ 
cat file1.txt
1730sh:~$
toe95027

toe950271#

如果命令 * 不是 * cd,则会有以下两行:

char* directory;
printf("1730sh:~%s$ \n", directory);

您正在使用***uninitialized***指针directory进行打印,该指针的值(指向的位置)是 * 不确定的 *,这将导致 * 未定义的行为 *。
作为一个简单的解决方案,我建议你创建另一个变量,一个数组,来保存当前目录。在主阅读循环 * 之外 * 定义该变量,当你改变目录时复制到该变量中。
比如说

char current_directory[256] = "";  // Initialize to the empty string

printf("1730sh:~$ \n");
while ((n = read(STDIN_FILENO, buf, BUFFERSIZE)) > 0)
{
    // ...

    if (!strcmp(array[j], "cd"))
    {
        strcpy(current_directory, array[j+1]);
        int change = chdir(current_directory);
    }

    // ...

    printf("1730sh:~%s$ \n", current_directory);
}

相关问题