在C中查找知道名称的文件地址

时间:2016-03-05 11:59:49

标签: c shell ubuntu cd chdir

我在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")并失败。

1 个答案:

答案 0 :(得分:2)

您使用use exec来运行ls命令,我怀疑您在选择要执行的命令之前fork()进程:{child}在子进程中执行,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));
}