我正在用C/Ubuntu为一个项目编写自己的shell,但是在使用chdir()实现cd时遇到了一些困难。chdir()需要路径名,但由于用户将写入(假设)cd DesktopDesktop不是路径名,因此程序将失败。
以下是我的代码:

child = fork();
if (child == 0) {
    if (!strcmp(args[0], "ls")) {
        execv("/bin/ls", args);
    }
    if (!strcmp(args[0] , "cd")) {
        chdir(args[1]);
    }
    perror("Error");
    exit(1);  //Failure
} else {
    do {
       waitpid(child, &status, WUNTRACED);
} while(!WIFEXITED(status) && !WIFSIGNALED(status));

所以我认为问题是args[1]得到的是"Desktop"等,而不是地址,所以chdir失败了。我在终端进行了测试,除了cd之外,其他所有命令都可以工作。我的问题是,我如何才能让这个chdir工作?换言之,我如何才能给出args[1]chdir的路径?
让我这样说。当我写cd Desktop到终端时,它就工作了。当我将cd Desktop写入自己的shell时,它会尝试执行chdir("Desktop")而失败。

最佳答案

使用“exec”运行ls命令,在选择执行哪个命令之前,我怀疑您fork()进程:chdir(args[1])在子进程中执行,子进程更改其当前目录,然后退出。每个进程都有自己的当前目录。父(shell)处理当前目录时不受其子目录更改的影响,而是保留其当前目录。
大多数命令应该在shell进程中执行,而不是分叉,只有外部命令应该在分叉到子进程之后执行。
以下是代码的修改版本:

/* frist execute local commands in the shell process. */
if (!strcmp(args[0], "cd")) {
    if (!args[1]) {
        fprintf(stderr, "cd: missing argument\n");
    } else
    if (chdir(args[1])) {
        perror("chdir");
    }
} else
if (!strcmp(args[0], "exit")) {
    int status = args[1] ? atoi(argv[1]) : 0;
    exit(status);
} else {
    /* otherwise, fork and attempt to execute an external command */
    child = fork();
    if (child == 0) {
        if (!strcmp(args[0], "ls")) {
            execv("/bin/ls", args);
        }
        /* if exec failed, the child process is still running */
        perror("exec");
        exit(1);  //Failure
    } else {
        do {
           waitpid(child, &status, WUNTRACED);
    } while(!WIFEXITED(status) && !WIFSIGNALED(status));
}

关于c - 在C中找到知道名称的文件地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35813837/

10-11 18:55