如何从 C 程序更改将在终端上生效的目录。
实际上不要告诉 system("") 函数或 chdir("") 函数。这些仅适用于 C 中的进程或子 shell。
假设我正在从 bash shell 执行一个 C 程序,其进程 ID 为 10223。
那么,我可以编写一段 C 代码来影响 10223 进程吗?该进程是一个 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
你不知道。你不能 (*)。工作目录是进程的一个属性。终端托管一个 shell;这是一个过程。你的程序是另一个进程。双胞胎永远不会见面。
但是,您正在解决错误的问题。假设您有一个 C 程序,它将 inode 号转换为路径,然后将生成的路径打印到标准输出。现在,您所需要的只是一个运行的 shell 别名cd $(my-program $1)
,你就看到了——一个通过 inode 进行 cd 的 shell 命令。
(*) 如果您编写一个程序来附加到 shell 进程ptrace
,并且您拥有必要的权限,您也许能够强制 shell 更改其工作目录。然而,由于外壳尤其正在维护类似的东西PWD
,这样的结果可能并不完全有效。
您可以编写一个 shell 函数,在每次检查文件的提示符下运行;如果该文件存在,该函数将读取该文件并将工作目录设置为其中的路径。也许这不是你的初衷。
由于您使用的 shell 是开源的(可能是 bash,可能是 zsh 或 Fish),您也可以考虑制作自己的 fork 并添加自己的极其慢的 shell 命令,将 inode 编号映射到目录并将 cd 映射到它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)