c - 如何让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 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 进行编译。

最佳答案

某些信息,包括环境变量的值和当前工作目录,从父进程传播到子进程,但不会传回父进程。如果子进程(您的程序)调用 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 系统调用)。

关于c - 如何让chdir()在程序结束后停留在指定目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18277177/

相关文章:

linux - 使用使用系统命令的 bash 脚本;当 COMMAND 向您询问某事时,您将如何输入?

c++ - Windows 上的 DLL Main 对比。 __attribute__((constructor)) Linux 上的入口点

mysql - 显示使用 auth_pam 插件创建的用户被拒绝访问(Percona pam for mysql)

c++ - 32 位 arm 处理器上的链接错误 : "Cannot find -ltinfo" on Ubuntu 12. 04

c - 在相对于指针的地址处存储地址或 NULL

c - 从 C 中的数组中删除重复值

c - 为什么此 C 代码将局部结构视为指针,而它似乎不是指针?

c - 为什么有些字符会改变?

c - 为什么我用 fgets() 读取的命令不适用于 execlp(),但硬编码的相同命令却能正常工作?

php - Ubuntu 12.04 php、mysql-server 和 phpmyadmin 安装 apache2 Web 服务器错误