留在popen目录中

时间:2009-10-28 10:14:57

标签: c++ directory popen

我想制作一些C ++程序,我在这里使用函数popen在Unix中向命令行发送命令。它运行正常,但是当我调用cd directory时,目录不会改变。当我尝试在完成脚本目录路径更改后在某些脚本中运行cd directory时,我的情况也是一样的。那么,我必须像. ./script.sh而不是./sript.sh一样运行脚本,但是如何使用popen函数执行此操作?我尝试在". "的第一个参数之前添加popen,但是运行". ls"会出错。

代码:

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"时,没有任何反应,例如尝试更改脚本中的目录。

2 个答案:

答案 0 :(得分:5)

通常,popen()命令执行命令的方式是通过shell。所以,它打开一个管子和叉子。孩子做了一些管道工作(将管道连接到标准输入或标准输出 - 取决于标志)然后执行

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

因此,它的行为方式将取决于您的关键环境变量 - 特别是PATH。

如果要在当前目录中执行脚本,则选择以下选项之一:

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

如果要执行“ls”命令:

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);

(显然,您需要在该批次中进行一些错误检查。)

答案 1 :(得分:0)

您似乎有一些您不理解的代码。您来自outp正在阅读。命名输入管道outp相当令人困惑。然后,您将读取的字符串并将其传递给m_session->send()

在整个过程中没有任何地方与Unix命令行进行交互。特别是,popen()不是。