2009-10-28 57 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