1

我想制作一些 C++ 程序,我在popen这里使用函数将命令发送到 Unix 中的命令行。它工作正常,但是当我调用时cd directory,目录不会改变。cd directory在完成脚本目录路径更改后,当我尝试在某些脚本中运行时,我认为它是相同的。所以,我必须像. ./script.shnot那样运行脚本./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",什么都不会发生,比如尝试更改脚本中的目录。

4

2 回答 2

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

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

于 2009-10-30T05:04:19.470 回答
0

您似乎有一些您不理解的代码。您正在阅读,outp一个管道。命名输入管道outp相当混乱。然后,您将读取的字符串传递给m_session->send().

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

于 2009-10-28T14:51:06.740 回答