如何从C文件更改终端中的目录

时间:2015-08-08 17:58:54

标签: c linux bash shell

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

实际上不要告诉系统(“”)功能或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代码返回后如何保持更改当前环境。

UPD 1:

如果我写ps,在终端

然后我得到以下输出。现在,我可以通过10991进程执行任何功能。我认为这解决了这个问题。

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

1 个答案:

答案 0 :(得分:2)

你没有。你不能 (*)。工作目录是进程的属性。终端托管一个shell;那是一个过程。你的程序是另一个过程。两个人永远不会见面。

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

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

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

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