Почему бы не использовать непроходимые хижины?

Я всегда импортирую базы данных из оболочки MySql. Это не обеспечивает индикатор хода выполнения, но это действительно (быстро) прокручивает действия, которые это выполняет так, я знаю, что это работает.

# mysql -u user -p -h host database
> source /path/to/some/largefile.sql;
24
29.05.2013, 17:36
3 ответа

Поиск ПУТИ является функцией стандартной библиотеки для C в пространстве пользователя, как переменные среды в целом. Ядро не видит переменных среды кроме тех случаев, когда оно передает по среде от вызывающей стороны execve к новому процессу.

Ядро не выполняет интерпретации на пути в execve (это - до функций обертки такой как execvp выполнить поиск ПУТИ) или в хижине (который более или менее перенаправляет execve звоните внутренне). Таким образом, необходимо поместить полный путь в хижину ¹. Исходная реализация хижины была всего несколькими строками кода, и она не была значительно расширена с тех пор.

В первых версиях Unix оболочка сделала работу вызова себя, когда это заметило вызов сценария. Хижина была добавлена в ядре по нескольким причинам (суммирующий объяснение Dennis Ritchie:

  • Вызывающая сторона не должна волноваться, является ли программа для выполнения сценарием оболочки или собственным двоичным файлом.
  • Сам сценарий указывает что интерпретатор использовать вместо вызывающей стороны.
  • Ядро использует название сценария в журналах.

Непроходимые хижины потребовали бы, чтобы любой увеличил ядро для доступа к переменным среды и процессу PATH, или иметь ядро выполняют программу пространства пользователя, которая выполняет поиск ПУТИ. Первый метод требует добавления непропорциональной суммы сложности к ядру. Второй метод уже возможен с a #!/usr/bin/env хижина.

¹ при помещении относительного пути он интерпретируется относительно к текущему каталогу процесса (не каталог, содержащий сценарий), который едва полезен в хижине.

20
27.01.2020, 19:41
  • 1
    Нет, ядро не требует полного пути в execve ни в хижине, хотя имеет мало смысла иметь относительный путь в хижине. –  Stéphane Chazelas 05.06.2013, 05:28
  • 2
    Для любого этому любопытно на предмет того, как "хижина перенаправляет вызов execve внутренне": это - на самом деле часть универсального механизма для рабочих интерпретаторов на исполняемых файлах, которым нужны они. Динамично связанные исполняемые файлы ELF "интерпретируются" /lib64/ld-linux-x86-64.so.2 (см. ldd вывод). Linux делает это полностью универсальным: binfmt поддержка (начиная с 2.1.43) позволяет Вам зарегистрировать путь интерпретатора / magic-number-or-file-extension пары. У Вас может быть PE32 .exes вызывают wine при выполнении их класс Java и файлы банки вызывают java, и т.д. и т.д. –  Peter Cordes 23.08.2015, 05:28

Там больше продолжается, чем кажется на первый взгляд. #! строки интерпретируются ядром Unix или Linux, #! не аспект оболочек. Это означает это PATH действительно не существует в то время, когда ядро решает, что выполниться.

Наиболее распространенный способ иметь дело с не знанием, который исполняемый файл работать или звонить perl портативным способом или подобный, должен использовать #!/usr/bin/env perl. Ядро выполняется /usr/bin/env, который наследовал a PATH переменная среды. env находит (в этом примере) perl в PATH и использование execve(2) системный вызов, чтобы заставить ядро работать perl исполняемый файл.

19
27.01.2020, 19:41
$ strace sleep 1
execve("/usr/bin/sleep", ["sleep", "1"], [/* 99 vars */]) = 0

Преобразование в полный путь сделано оболочкой (более общий: в пространстве пользователя). Ядро ожидает имя файла / путь, к которому оно может получить доступ непосредственно.

Если Вы хотите систему, находят Ваш исполняемый файл путем просмотра переменной ПУТИ, можно переписать хижину как #!/usr/bin/env EXEC.

Но также и в этом случае это не ядро, кто делает поиск.

4
27.01.2020, 19:41
  • 1
    Преобразование в полный путь сделано оболочкой Спасибо, хотя... пример, который, как предполагают, проиллюстрировал это? Поскольку я вижу его, оболочка просто работает strace (преобразованный в /usr/bin/strace в какой-то момент) с 2 аргументами. –  Alois Mahdal 08.06.2016, 00:31

Теги

Похожие вопросы