Шрифт:
Версии с суффиксом «p» будут искать исполняемый модуль программы в списке каталогов, приведенном в переменной окружения PATH. Вы, вероятно, отметили, что во всех примерах местоположение исполняемых модулей строго определено —
Это сообщает командному интерпретатору, что когда я набираю команду, он в первую очередь должен просмотреть каталог
Если вы не знаете путь к выполнимой программе, вы можете использовать варианты с суффиксом «p».
Например:
Если функция execl не сможет найти
А что произойдет, если сделать так?
Выполняет ли этот вызов поиск в окружении? Нет. Вы явно указали execlp имя пути, что отменяет правило поиска в PATH. Если
Опасно ли смешивать явный путь с простым именем команды (например, указывать путь как
• значительное число программ так или иначе игнорирует
• те программы, поведение которых зависит от их имени, обычно вызывают функцию basename, которая удаляет каталоговую часть
Единственная обоснованная причина использования полного имени пути в качестве первого параметра заключается в том, что программа может выводить диагностические сообщения, содержащие этот первый параметр, который немедленно укажет вам, откуда она была вызвана. Это может быть важно, если копии программы располагаются в нескольких каталогах из перечисленных в PATH.
Функции семейства spawn имеют дополнительный параметр; во всех приведенных выше примерах я всегда указывал P_WAIT. Имеются четыре флага, которые вы можете придать функции spawn, чтобы изменить ее поведение:
P_WAIT | Вызывающий процесс (ваша программа) будет блокирован до тех пор, пока вновь созданный процесс не отработает и не завершится. |
P_NOWAIT | Вызывающая программа не будет блокирована на время выполнения вновь созданной. Это позволяет вам запустить программу в фоновом режиме и продолжать выполнение, пока она делает свое дело. |
P_NOWAITO | Аналогично P_NOWAIT за исключением того, что устанавливается флаг SPAWN_NOZOMBIE. Это означает, что вы не должны беспокоить себя вызовом функции waitpid для очистки кода завершения процесса. |
P_OVERLAY | Этот флаг превращает вызов функции spawn в соответствующей вызов exec! Ваша программа преобразуется в указанную программу без изменения идентификатора процесса ID. Вообще-то, если вы хотите сделать именно так, то, наверное, будет более корректно использовать вызов exec, поскольку это избавит будущих читателей ваших исходных текстов от необходимости искать P_OVERLAY в справочном руководстве по библиотеке языка Си! |
Как мы упомянули выше, все функции семейства spawn, в конечном счете, вызывают базовую функцию spawn. Ниже приведен прототип функции spawn: