2015-08-08 87 views
-1

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

其实不要告诉系统(“”)功能或chdir(“”)功能。这些工作只是在C的过程或子壳。

说我正在执行一个C程序从一个进程ID为10223的bash shell。 那么,我可以写一个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进程执行命令。我认为这解决了这个问题。

[email protected]:~$ ps 
    PID TTY   TIME CMD 
10991 pts/14 00:00:00 bash 
11005 pts/14 00:00:00 ps 
+1

您不能更改另一个进程的当前工作目录。你为什么要这么做? –

+0

好吧我正在写一个C代码,我可以通过inode值更改目录。可能吗 ? – Kryptonyte

+0

毕竟,你为什么需要通过inode光盘?你知道inode而不是路径的情况是怎样的? –

回答

2

你不知道。你不能 (*)。工作目录是进程的属性。终端拥有一个外壳;这是一个过程。你的程序是另一个过程。从来没有两个人见面。

但是,您正在解决错误的问题。假设您有一个将inode编号转换为路径的C程序,然后将结果路径打印到标准输出。现在,您需要的仅仅是运行cd $(my-program $1)的shell别名,并且您还有一个shell命令,即通过inode执行的cd命令。 (*)如果使用ptrace编写附加到shell进程的程序,并且拥有必要的权限,则可以强制shell更改其工作目录。但是,由于外壳特别是正在维护诸如PWD之类的东西,因此可能不完全有效。

您可以编写一个shell函数,该函数在检查文件的每个提示符处运行;如果该文件存在,该函数将读取它并将工作目录设置为其中的路径。可能这不是你想到的。由于您使用的shell是开源的(可能是bash,也许是zsh或fish),您可能还会考虑制作自己的fork并添加您自己的极其缓慢的shell命令,该命令可将inode编号映射到目录,并将cd映射到它们。

+0

好吧,我正在写一个C代码,我可以通过inode值更改终端的目录。可能吗 ? – Kryptonyte

+1

@Kryptonyte这没有任何意义。你试图完成什么? –

+0

据我所知,除非是暂时的,否则你不能通过ptrace。 – bmargulies

相关问题