0

我在使用 popen 从 C++ 程序中运行 perl 脚本时遇到问题。

只要我调用 fgets,feof 就会返回 1

到目前为止,我有以下代码。

std::string PerlOutput = "";
std::stringstream CommandToRun;
CommandToRun << "perl " << ScriptFile << " " << ParametersToPass; //Both variables are type std::string
std::cout << "Executing perl script, command to execute is:\n" + CommandToRun.str() << "\n";
FILE * perl_outpipe = popen(CommandToRun.str().c_str(), "r");
unsigned int MaxLineLen = 512;
char buffer[MaxLineLen];
while(!feof(perl_outpipe))
{
    if(fgets(buffer, MaxLineLen, perl_outpipe) != NULL)
    {
        PerlOutput.append(buffer);
    }
}
pclose(perl_outpipe);
std::cout << "Perl script output:\n" << PerlOutput << "\n"; //Huh? It's empty!
std::cout << "length of perl's output: " << PerlOutput.length() << "\n";

这个想法是 perl 的输出可能会或可能不会大于缓冲区,因此对于每个 fgets 调用,我只需将其附加到 std::string 对象中,并在 perl 完成输出后处理它。

但是没有任何东西被附加到这个字符串中,因为它立即遇到了一个 eof。我首先认为也许我给 popen 的命令可能是错误的。空格字符在错误的位置等,所以在调用 popen 之前,我转储了确切的命令。如果我将此命令复制并粘贴到终端窗口,然后自己运行该命令,它会按预期工作。

Executing perl script, command to execute is:
perl scripts/testscript.pl param1=abc param2=123 param3=Nooo!\ not\ Jackson\ 5!

经过一番阅读,我发现其他人与一年前听起来完全相同的问题。有一些细微的差别,比如 PHP 而不是 Perl。直接调用脚本,而不是调用解释器,将脚本作为参数。还有 CentOS(我使用的是 Debian)。除此之外,听起来几乎一模一样……

显然在那种情况下这是一个权限问题,但我似乎不是这种情况。

权限是:

rw-r--r-- mumbles mumbles scripts/testscript.pl
rwxr-xr-x root root /usr/bin/perl

我的程序以我的身份运行(而不是作为它自己的用户),所以它应该有我的权限吗?每个人都可以阅读我的脚本,每个人都可以执行 perl。所以,如果我可以这样调用我的脚本,任何人都可以看到为什么我的 C++ 程序不能?

我的程序的输出(在 perl 应该完成它的事情之后

Perl script output:

length of perl's output: 0
4

0 回答 0