Gar*_*iel 1 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" );
Run Code Online (Sandbox Code Playgroud)
在message.body();是string我要运行(我是从收到此XMPP).当string是,例如"ls",它会返回string在实际目录中的文件列表.但是当消息出现时"cd directory",没有任何反应,比如尝试更改脚本中的目录.
通常,popen()命令执行命令的方式是通过shell.所以,它打开一个管子和叉子.孩子做了一些管道工作(将管道连接到标准输入或标准输出 - 取决于标志)然后执行
execl("/bin/sh", "/bin/sh", "-c", "what you said", (char *)0);
Run Code Online (Sandbox Code Playgroud)
因此,它的行为方式将取决于您的关键环境变量 - 特别是PATH.
如果要在当前目录中执行脚本,则可以选择以下选项之一:
outp = popen("./script.sh", "r");
outp = popen("sh -x ./script.sh", "r");
outp = popen("sh -c './script.sh arg1 arg2'", "r");
Run Code Online (Sandbox Code Playgroud)
如果要执行' ls'命令:
outp = popen("/bin/ls /the/directory", "r");
Run Code Online (Sandbox Code Playgroud)
如果你想在运行之前更改目录:
outp = popen("cd /somewhere/else; ./script", "r");
Run Code Online (Sandbox Code Playgroud)
等等...
如果要更改使用popen()的程序的目录,则需要使用'chdir()'系统调用(或可能使用fchdir()).如果您认为您可能想要回到开始的地方,请使用:
int fd = open(".", O_RDONLY);
chdir("/some/where/else");
...do stuff in new directory
fchdir(fd);
Run Code Online (Sandbox Code Playgroud)
(显然,您需要在该批次中进行一些错误检查.)