Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不是';t chdir()工作吗?_C_Linux_Shell - Fatal编程技术网

为什么不是';t chdir()工作吗?

为什么不是';t chdir()工作吗?,c,linux,shell,C,Linux,Shell,当我尝试运行时。/shell cd包含/ 我实际上并没有切换到includes目录。这是我的密码: int cd(char *path) { printf("i got there at least\n"); if(path == NULL) { printf("dont waork\n"); print_usage(); } else { prin

当我尝试运行时。/shell cd包含/ 我实际上并没有切换到includes目录。这是我的密码:

int cd(char *path) {
        printf("i got there at least\n");
        if(path  == NULL) {
                printf("dont waork\n");
                print_usage();
        } else {

                printf("print please\n");
                int dir_change = chdir(path);
                if(dir_change != 0)
                        print_no_directory(path);

        }
        return 1;
}


int shell(int argc, char *argv[]) {

        pid_t pid;
        int status;

        pid = fork();
        if(pid == 0) {
                execl("cd", argv[0], argv[1], argv[2], (char*)NULL);
                printf("argv[1]: %s\n", argv[1]);
                if(!strcmp(argv[1], "cd")) {
                        cd(argv[2]);
                }
        } else if(pid > 0) {
                waitpid(pid, &status, WUNTRACED);
        } else {
                print_fork_failed();
        }
        return 0;
}

我看不出我的代码有什么问题。

你不能运行一个程序来更改另一个程序(你的shell)的目录

发生的是

  • 将生成一个新进程来运行您的程序
  • 该程序调用
    chdir()
    ,以更改其当前目录
  • 程序结束,导致进程终止
  • 贝壳还在原处

  • 这就是为什么shell中的
    cd
    是一个内置命令。

    除非开发自己的shell,否则无法创建这样的
    cd
    命令


    chdir
    命令可以工作,但只能在程序内部工作。退出后,您将返回到父shell当前目录。

    我尝试分叉进程,但仍然不起作用:/@franklinsing不,当然不行,
    fork()
    的目的是创建一个新进程。更改新进程的当前目录将永远不会“继承回”其父进程,这是我的观点。啊,我明白你的意思,谢谢!