Я пытаюсь вызвать системные команды из perl, используя system()
.
Обычно это работает нормально, но когда я не запускаю perl-скрипт сам, но имею скомпилированную программу на C, запускаю ее с помощью C popen()
функция, то perl не сможет выполнять свои системные команды. Perl's system()
затем возвращается с кодом выхода 13.
Это работает, только если я использую обратные кавычки в Perl вместо system
. Кто-нибудь знает почему?
Было бы полезно увидеть часть вашего кода / вывода. Вот мое предположение о первопричине вашей проблемы.
Во-первых, сигнал 13 приравнивается к SIGPIPE, который в этом случае, кажется, указывает на то, что процесс perl пытается записать в канал (то есть STDOUT / STDERR), но нет ничего, чтобы его прочитать.
Я немного протестировал и у меня вопрос: обрабатываете ли вы вывод скрипта в своей программе на C? В моих тестах простая обработка вывода сценария perl позволила избежать ошибки SIGPIPE.
Сигнал 13 произведен:
fp = popen("/home/chuckx/perl-test/perl.pl","r");
status = pclose(fp);
Сигнал 13 исключен:
fp = popen("/home/chuckx/perl-test/perl.pl","r");
do {} while (fgets(output,80,fp) != NULL);
status = pclose(fp);
Я добавляю этот ответ на старый вопрос, потому что столкнулся с аналогичной проблемой с popen
. Если я запустил команду с popen
(в программе на C / C ++) и не считывать вывод программы перед вызовом pclose, он возвращает значение 13. Я думаю, что здесь происходит то, что выполняющаяся команда не может записать весь вывод в конвейер (потому что Я никогда ничего не читал), поэтому при закрытии возвращает значение 13.
Если это происходит с кем-либо еще, попробуйте прочитать все содержимое канала / файла, возвращенного popen
перед закрытием.