【问题标题】:How to change directory in terminal from a C file如何从 C 文件更改终端中的目录
【发布时间】:2015-11-01 00:45:36
【问题描述】:

如何从影响终端的 C 程序更改目录。

其实别说 system("") 函数或 chdir("") 函数。这些仅适用于 C 中的进程或子 shell。

假设我正在从进程 ID 为 10223 的 bash shell 执行 C 程序。 那么,我能否编写一个影响 10223 进程的 C 代码,该进程是一个 bash shell,其路径将被我的 C 程序更改。

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include<dirent.h>
#include <unistd.h>
using namespace std ;
int main(){

  system("pwd") ;
  chdir("test");
  system("pwd") ;
  return 0 ;
}

此更改仅在 C 代码运行之前进行。从 C 代码返回后,如何继续更改当前环境。

更新 1:

如果我在终端中写 ps 然后我得到以下输出。现在我可以有任何功能通过 10991 进程执行命令。我认为这可以解决问题。

sbmaruf@kryptonyte:~$ ps
  PID TTY          TIME CMD
10991 pts/14   00:00:00 bash
11005 pts/14   00:00:00 ps

【问题讨论】:

  • 您不能更改另一个进程的当前工作目录。你为什么要这样做?
  • 好的,我正在编写一个可以通过 inode 值更改目录的 C 代码。有可能吗?
  • 毕竟,为什么需要通过inode cd?知道inode但不知道路径的情况是什么?

标签: c linux bash shell


【解决方案1】:

你没有。你不能 (*)。工作目录是进程的一个属性。终端托管一个外壳;这是一个过程。你的程序是另一个进程。双胞胎永远不会相遇。

但是,您正在解决错误的问题。假设您有一个 C 程序将 inode 编号转换为路径,然后将生成的路径打印到标准输出。现在,您所需要的只是一个运行cd $(my-program $1) 的shell 别名,然后您就有了——一个通过inode cd 的shell 命令。

(*) 如果您编写一个程序以使用ptrace 附加到shell 进程,并且您拥有必要的权限,您可能可以强制shell 更改其工作目录。但是,由于 shell尤其是维护了 PWD 之类的东西,因此结果可能不完全有效。

您可以编写一个 shell 函数,在每个检查文件的提示符处运行;如果文件存在,该函数将读取它并将工作目录设置为其中的路径。可能这不是您的想法。

由于您使用的 shell 是开源的(可能是 bash,也可能是 zsh 或 fish),您还可以考虑制作自己的 fork 并添加自己的速度极慢的 shell 命令,将 inode 编号映射到目录并将 cd 映射到它们。

【讨论】:

  • 好的,我正在编写一个 C 代码,我可以在其中通过 inode 值更改终端目录。有可能吗?
  • @Kryptonyte 这没有任何意义。你想完成什么?
  • 据我所知,不,你不能,除非,非常试探性地,通过 ptrace。
  • 我认为 OP 希望 shell 可以通过 inode 进行 cd:askubuntu.com/questions/658092/….
  • 你指的是我的线程......那个线程是我创建的。我无权通过该帐户在此处提问。
猜你喜欢
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 2020-09-30
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多