程序完成后,如何使chdir()保持在指定的目录中?

程序完成后,如何使chdir()保持在指定的目录中?,c,linux,ubuntu-12.04,chdir,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

我有一个程序调用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;
}

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

一个进程的环境不能被另一个进程改变。其中包括当前工作目录。因此,您不能停留在目录中。

一个进程的环境不能被另一个进程更改。其中包括当前工作目录。因此,不可以,您不能停留在目录中。

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

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

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

例如,如果您更改:

chdir(path);

您可以使用shell函数:

my_func() {
    eval `your_program`
}
my_func
将更改shell的当前目录

或者您可以将
cd
命令直接放入函数中,或者放入通过
执行的脚本中。脚本名称
或源脚本名称而不是执行它


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

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

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

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

例如,如果您更改:

chdir(path);

您可以使用shell函数:

my_func() {
    eval `your_program`
}
my_func
将更改shell的当前目录

或者您可以将
cd
命令直接放入函数中,或者放入通过
执行的脚本中。脚本名称
或源脚本名称而不是执行它


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

从技术上讲,“环境”只是作为
main
的第三个参数提供的KEY=value字符串的向量,不包括当前工作目录(在Unix上;IIRC每个驱动器的CWD在Windows上表示为特殊的环境变量)。但是,一个进程的环境或工作目录都不能被另一个进程更改,这是事实。我使用这个术语时比较随意。您知道进程状态的正确术语吗,通常包括cwd、env变量、装入点等?我认为没有正式术语,但如果您说的是“继承的进程状态”我认为这已经足够清楚了。从技术上讲,“环境”只是作为
main
的第三个参数提供的KEY=value字符串的向量,不包括当前的工作目录(在Unix上;IIRC每个驱动器的CWD在Windows上表示为特殊的环境变量)。但是,一个进程的环境或工作目录都不能被另一个进程更改,这是事实。我使用这个术语时比较随意。您知道进程状态的正确术语吗,通常包括cwd、env变量、装入点等?我认为没有正式术语,但如果您说的是“继承的进程状态”我想这已经足够清楚了。我不太确定这是否有效。你可以用c代码和bash/sh脚本的完整工作示例来编辑这个问题吗?@TrevorHickey:你的意思是编辑我的答案吗?没关系,我成功了。我不太确定这是否有效。你可以用c代码和bash/sh脚本的完整工作示例来编辑这个问题吗ode和bash/sh脚本?@TrevorHickey:你是说编辑我的答案吗?没关系,我让它工作了。