2015-08-08 25 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

相關問題