如何在程序完成后使chdir()停留在指定的目录中?

时间:2013-08-16 15:39:11

标签: c linux ubuntu-12.04 chdir

我有一个程序调用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进行编译。

2 个答案:

答案 0 :(得分:4)

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

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

如果您想让程序更改shell的当前目录,则需要间接执行此操作。例如,您的程序可以打印cd命令,您可以在shell中输出eval。 (你可以将它包装在一个函数中。)

例如,如果您更改:

chdir(path);

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

你可以有一个shell函数:

my_func() {
    eval `your_program`
}

my_func将更改shell的当前目录。

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

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

答案 1 :(得分:2)

另一个流程无法更改一个流程的环境。这包括当前的工作目录。所以不,你不能留在目录中。