Назад | Перейти на главную страницу

Код выхода 13 из команды Perl system ()?

Я пытаюсь вызвать системные команды из 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 перед закрытием.