Что стоит за функцией system в Perl? - PullRequest
4 голосов
/ 24 апреля 2010

Я могу подумать, что он откроет оболочку, выполнит параметр (команду оболочки) и вернет результат в скаляре.Но выполнение system функции в скрипте Perl выполняется быстрее, чем команда оболочки.Это будет вызывать эту команду в C?Если да, в чем разница между

rmdir foo

и

system('rmdir foo');

Ответы [ 2 ]

11 голосов
/ 24 апреля 2010
  1. Разница между ними заключается в том, что второй откроет (разветвит) дочерний процесс (который будет командой rmdir), а первый совершит прямой системный вызов Unix с использованием API, не открывая процесс , Открытие дочернего процесса стоит дорого с точки зрения ресурсов.

  2. system() вызов всегда будет открывать дочерний процесс для выполнения, НО, он может либо открыть оболочку, которая, в свою очередь, разветвит желаемую программу как собственный дочерний процесс (таким образом, получая 2 дочерних процесса), или отключите программу как дочерний процесс напрямую.

    Выбор, когда Perl откроет оболочку во время вызова system(), прописан в perldoc -f system . Краткая (и не на 100% точная) версия:

    • Если в системном вызове есть только один параметр, а параметр оценивается как строка, содержащая метасимволы оболочки, оболочка будет разветвлена ​​первой.

    • Если есть только один параметр и он не имеет метасимволов; или существует список параметров> 1 элемента, программа разветвляется напрямую в обход оболочки.

Таким образом:

system("rmdir foo"); # forks off rmdir command directly

system("rmdir", "foo"); # forks off rmdir command directly

system("rmdir foo > out.txt"); # forks off a shell because of ">" 
5 голосов
/ 24 апреля 2010

Ваш system вызов запускает отдельный процесс, в то время как собственная rmdir Perl будет вызывать встроенную функцию C в контексте процесса Perl.Оба метода в итоге выполняют одни и те же системные вызовы, но открытие нового процесса менее эффективно. *

Лучше всего использовать собственные функции Perl (например, rmdir): они переносимы, и вы нене нужно беспокоиться о интерпретации кодов выхода оболочки, экранировании метасимволов в именах файлов для предотвращения угроз безопасности и т. д.

*system создаст дополнительный процесс sh, если ваша команда содержит каналы, перенаправление ввода / вывода,&& и т. Д. Это не относится к вашему случаю, но может сделать параметр system еще медленнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...