1

我有一个调用 chdir() 来更改 cwd 的程序。但是,在程序完成后,cwd 会更改回调用程序的目录,而不是停留在调用 chdir() 指定的目录中。我编写了一个程序来测试 chdir() 是否实际上正在更改为指定的目录,并发现 chdir() 正在执行我的假设:在程序执行期间更改为指定的目录,然后返回到执行程序的目录。

这是测试的代码:

#include <stdio.h>
#include <unistd.h>

#define NAME_MAX 100

int main(int argc, char **argv)
{
    char buf[NAME_MAX];
    char *path = argv[1];

    if (chdir(path) == -1) { /* change cwd to path */   
        fprintf(stderr, "error: could not change to dir %s\n", path);
        return 1;
    }
    getcwd(buf, NAME_MAX);
    printf("CWD is: %s\n", buf); /* print cwd as obtained from getcwd() */

    return 0;
}

这是我终端的输出:

john@ubuntu:~/C/cli$ pwd
/home/john/C/cli
john@ubuntu:~/C/cli$ mkdir foobar
john@ubuntu:~/C/cli$ ./test.c foobar
CWD is: /home/john/C/cli/foobar
john@ubuntu:~/C/cli$ pwd
/home/john/C/cli

所以我的问题是,如何在程序完成留在我在调用 chdir() 时指定的目录中?另外,我在 Ubuntu 12.04 上使用 gcc 进行编译。

4

2 回答 2

4

某些信息,包括环境变量的值和当前工作目录,会从父进程传播到子进程,但不会传回父进程。如果子进程(您的程序)调用chdir或设置或修改环境变量,则会影响该进程及其任何子进程,但不会影响父进程。

这就是为什么chdir在 shell 中有一个内置命令;它不能作为一个单独的程序来实现。

如果您想让程序为您更改 shell 的当前目录,则需要间接进行。例如,您的程序可以打印cd命令,并且您可以eval在 shell 中输出该命令。(您可以将其包装在一个函数中。)

例如,如果您更改:

chdir(path);

printf("cd %s\n", path);

你可以有一个shell函数:

my_func() {
    eval `your_program`
}

并将my_func更改您的 shell 的当前目录。

或者,您可以将命令直接放在函数中,或者放在您通过或而不是执行它cd执行的脚本中。. script-namesource script-name

所有这些解决方案都需要您当前的 shell 执行cd命令本身(在内部调用chdir系统调用)。

于 2013-08-16T15:51:28.980 回答
2

一个进程的环境不能被另一个进程改变。这包括当前的工作目录。所以不,你不能留在目录中。

于 2013-08-16T15:40:44.530 回答