【问题标题】:Stay in directory with popen使用 popen 留在目录中
【发布时间】:2009-10-28 10:14:57
【问题描述】:

我想做一些 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" 时,什么都不会发生,比如尝试在脚本中更改目录。

【问题讨论】:

  • 你如何更改目录? (代码示例可能很有用)
  • 程序中如何更改目录?
  • 我正在使用它的示例代码。在这里我尝试添加“.”,就像在运行脚本时一样,但是“.ls”会出错。没有“.”,目录不会改变。

标签: c++ directory popen


【解决方案1】:

通常,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);

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 不,你不明白。我在 message.body(); 中有一些字符串。我创建了名为 outp 的 FILE*(它是 outp,因为在这里我得到了函数 popen 的输出)。我正在调用函数 popen,函数 popen 从参数中获取字符串,将其提供给 Unix 系统,并将此命令的输出提供给 outp。因此,如果我想在 C++ 程序中调用“ls”,我将调用 popen("ls","r") 并且 ls 的输出在文件中,popen 返回该文件。有用。但它不适用于“cd 目录”,就像您尝试从某个 bash 脚本调用“cd 目录”一样。
    • 如果你得到另一个程序的输出,它就是你的输入
    猜你喜欢
    • 1970-01-01
    • 2013-09-21
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    相关资源
    最近更新 更多