Русский
Русский
English
Статистика
Реклама

Перевод Заметки о Unix небольшая странность семейства вызовов exec()

Я недавно писал об опции -exec команды find и ненароком упомянул о семействе системных вызовов exec(). Это странное выражение, обычно о Unix-вызовах так не говорят, так как они, как правило, не объединяются в некие семейства. Но в данном случае речь идёт о целом наборе схожих механизмов. Перечислим их:

execv() execve() execvp() execvpe()execl() execlp() execle()

(Этот список выглядит именно так в Linux и в OpenBSD; подобный список, составленный для FreeBSD, включал бы в себя execvP(), а не execvpe(). В POSIX-версии подобного списка нет вызова execvpe(), но есть вызов fexecve(), который я не вполне готов включить в семейство вызовов exec().)



Одна из этих команд не похожа на другие. На самом деле, во всём этом списке, включающем в себя, как минимум, шесть exec()-функций, лишь execve() относится к системным вызовам; остальные exec*()-функции это просто библиотечные функции, в основе которых лежит execve(). То, что существуют удобные библиотечные функции, основанные на системном вызове (или на нескольких вызовах), не является чем-то необычным; так, например, устроено всё то, что имеет отношение к stdio. Но всё это выглядит несколько странно из-за того, что имена функций весьма близки друг к другу. У меня хорошая память на имена libc-функций Unix, но я, вероятно, в большинстве случаев, не смог бы выделить из вышеприведённого списка настоящий системный вызов exec().

(Сейчас-то я, конечно, хорошо помню о том, что execve() это системный вызов, который, в большинстве Unix-дистрибутивов, лежит в основе exec*()-функций.)

Такое множество функций со схожими именами существует со времён V7 Unix, где документация по execl(), execv(), execle() и execve() размещена в справочном файле exec(2). В V7, по состоянию на сегодняшний день, базовым системным вызовом является execve(), хотя ему назначено другое имя. Даже в V6 execl() и execv() описаны в единственном справочном файле exec(2).

(Соответствующий системный вызов V6 был назван exec и принимал лишь программу, которую нужно выполнить, и argv. Когда в V7 появилось такое понятие, как окружение, там сохранился системный вызов exec из V6, который, в качестве дополнительного аргумента, принимал envp.)

P.S. В некоторых дистрибутивах Unix есть базовые системные вызовы, которые, по сути, являются разновидностями одного и того же вызова. Такая ситуация сложилась из-за того, что API системных вызовов развивался и совершенствовался достаточно длительное время. Например, подобное могло произойти при добавлении в систему 64-битных вариантов вызовов, которые раньше были 32-битными. Правда, обычно в сознании людей присутствуют лишь самые свежие версии системных вызовов; они не представлены некими семействами разновидностей какого-то вызова и в этом смысле не похожи на семейство exec().

Встречались ли вы с какими-то странностями, касающимися именования сущностей в Unix?

Источник: habr.com
К списку статей
Опубликовано: 24.04.2021 12:23:53
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Блог компании ruvds.com

Системное администрирование

*nix

Разработка под linux

Unix

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru