我想制作一些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"
时,没有任何反应,例如尝试更改脚本中的目录。
答案 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()
不是。