У меня проблема с запуском Perl-скрипта из программы на C ++ с использованием popen.
Как только я позвоню 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 завершил вывод.
Но ничто никогда не добавляется в эту строку, так как она сразу же попадает в конец. Сначала я подумал, что, возможно, команда, которую я давал попену, может быть неправильной. Пробелы в неправильном месте и т. Д., Поэтому перед вызовом 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
Задача ещё не решена.