2009-10-28 45 views
1

我想製作一些C++程序,我在這裏使用函數popen將命令發送到Unix中的命令行。它工作正常,但是當我撥打cd directory時,目錄不會更改。當我嘗試在某些腳本中運行cd directory時,在完成腳本目錄路徑更改之後,這是相同的。所以,我必須運行腳本. ./script.sh而不是./sript.sh,但如何用popen函數來運行?我曾嘗試在popen的第一個參數前添加". ",但運行". ls"會發生錯誤。留在popen目錄中

代碼:

cout << "@ Command from " << session->target().full() << ": " << message.body() << endl; 
//cout << "Prisla zprava" << endl; 
//m_session->send("Hello World", "No Subject"); 
//system(message.body().c_str()); 
//if (message.body() == "") 
FILE* outp; 
char buffer[100]; 
string outps = ""; 
outp = popen(message.body().c_str(), "r"); 
while (!feof(outp)) 
{ 
    fgets(buffer, 100, outp); 
    outps = outps + buffer; 
} 
pclose(outp); 
cout << "& Output from command: " << outps << endl; 
m_session->send(outps.c_str(), "Output"); 

message.body();string我要運行(我是從XMPP收到此)。當string例如爲"ls"時,它返回string以及實際目錄中的文件列表。但是當消息是"cd directory"時,沒有任何反應,例如嘗試在腳本中更改目錄。

+0

你怎麼chandging目錄? (代碼示例可能有用) – Mark 2009-10-28 10:20:11

+0

如何更改程序中的目錄? – 2009-10-28 10:20:16

+0

有我使用它的示例代碼。在這裏,我嘗試添加「。「就像運行腳本時一樣,但是」。 ls「出錯,沒有」。 「目錄不會改變 – 2009-10-28 10:23:59

回答

5

通常,popen()命令執行命令的方式是通過shell。所以,它打開一個管道,叉子。孩子做一些管道(管道連接到標準輸入或標準輸出 - 根據標誌),然後執行

execl("/bin/sh", "/bin/sh", "-c", "what you said", (char *)0); 

所以,這一切的行爲是如何將取決於你的關鍵的環境變量 - 尤其是PATH 。

如果你想在當前目錄下執行一個腳本,那麼這些選項之一:如果要執行「ls」命令

outp = popen("./script.sh", "r"); 
outp = popen("sh -x ./script.sh", "r"); 
outp = popen("sh -c './script.sh arg1 arg2'", "r"); 

outp = popen("/bin/ls /the/directory", "r"); 

如果你想在運行之前改變目錄:

outp = popen("cd /somewhere/else; ./script", "r"); 

等等..

如果你想改變使用popen()的程序的目錄,那麼你需要使用'chdir()'系統調用(或者可能是fchdir())。如果你認爲你可能想回到你開始的地方,使用方法:

int fd = open(".", O_RDONLY); 
chdir("/some/where/else"); 
...do stuff in new directory 
fchdir(fd); 

(顯然,你需要一些錯誤檢查該批次)。

0

看來你有一些你不明白的代碼。你是閱讀outp,管道。命名輸入管道outp相當混亂。然後你把你讀過的字符串傳給m_session->send()

在這整個過程中你沒有任何地方與Unix命令行進行交互。特別是,popen()不是。

+1

不,你不明白 我在message.body中獲得了一些字符串();我創建了FILE *名爲outp(這是因爲我在這裏得到了函數popen的輸出)。我調用函數popen,函數popen從參數中獲取字符串,將它提供給Unix系統,並從該命令輸出給outp。因此,如果我想在C++程序中調用「ls」,我會調用popen(「ls」 ,「r」),ls的輸出在文件中,popen返回,它可以工作,但它不適用於「cd目錄」,就好像你試圖從某個bash腳本中調用「cd directory」一樣 – 2009-10-29 07:59:56

+0

If你得到另一個程序的_output_,它是_input_爲你。 – MSalters 2009-10-30 09:31:45

相關問題