www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Подписка
Архив номеров
Где купить
Авторам
Рекламодателям
Контакты
   

  Опросы
1001 и 1 книга  
19.03.2018г.
Просмотров: 11114
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 11238
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

12.03.2018г.
Просмотров: 8707
Комментарии: 0
Глубокое обучение с точки зрения практика

 Читать далее...

12.03.2018г.
Просмотров: 5277
Комментарии: 0
Изучаем pandas

 Читать далее...

12.03.2018г.
Просмотров: 6136
Комментарии: 0
Программирование на языке Rust (Цветное издание)

 Читать далее...

19.12.2017г.
Просмотров: 6021
Комментарии: 0
Глубокое обучение

 Читать далее...

19.12.2017г.
Просмотров: 8876
Комментарии: 0
Анализ социальных медиа на Python

 Читать далее...

19.12.2017г.
Просмотров: 5470
Комментарии: 0
Основы блокчейна

 Читать далее...

19.12.2017г.
Просмотров: 5678
Комментарии: 0
Java 9. Полный обзор нововведений

 Читать далее...

16.02.2017г.
Просмотров: 9858
Комментарии: 0
Опоздавших не бывает, или книга о стеке

 Читать далее...

17.05.2016г.
Просмотров: 13257
Комментарии: 0
Теория вычислений для программистов

 Читать далее...

30.03.2015г.
Просмотров: 14737
Комментарии: 0
От математики к обобщенному программированию

 Читать далее...

18.02.2014г.
Просмотров: 16477
Комментарии: 0
Рецензия на книгу «Читаем Тьюринга»

 Читать далее...

13.02.2014г.
Просмотров: 11340
Комментарии: 0
Читайте, размышляйте, действуйте

 Читать далее...

12.02.2014г.
Просмотров: 9324
Комментарии: 0
Рисуем наши мысли

 Читать далее...

10.02.2014г.
Просмотров: 7582
Комментарии: 4
Страна в цифрах

 Читать далее...

18.12.2013г.
Просмотров: 6709
Комментарии: 0
Большие данные меняют нашу жизнь

 Читать далее...

18.12.2013г.
Просмотров: 5587
Комментарии: 0
Компьютерные технологии – корень зла для точки роста

 Читать далее...

04.12.2013г.
Просмотров: 5199
Комментарии: 0
Паутина в облаках

 Читать далее...

03.12.2013г.
Просмотров: 5530
Комментарии: 1
Рецензия на книгу «MongoDB в действии»

 Читать далее...

Друзья сайта  

 Shebang – уроки истории

Архив номеров / 2013 / Выпуск №12 (133) / Shebang – уроки истории

Рубрика: Карьера/Образование /  Пятая пара

Денис Силаков ДЕНИС СИЛАКОВ, кандидат ф.-м. н., ЗАО «РОСА», член рабочей группы LSB, старший архитектор, занимается автоматизацией разработки ОС «РОСА», denis.silakov@rosalab.ru

Shebang – уроки истории

Все знают, что скрипты в UNIX принято начинать с символов #!, но не все догадываются, почему. Оказывается, это довольно поучительная история!

Известно, что учиться лучше всего на ошибках, причем на чужих. Но изучение удачных решений тоже очень полезно для повышения квалификации. Для разработчиков ИТ-систем хорошие примеры обоих видов предоставляет история shebang – такое имя получило сочетание символов решетки и восклицательного знака (#!), с которого начинаются скрипты в UNIX-подобных ОС.

Предыстория и постановка задачи

С точки зрения пользователя, одна из основных задач ОС – запускать и выполнять различные приложения. Однако что значит «запустить программу»? Для пользователей современных сред с графическим интерфейсом это означает кликнуть на иконку программы или выбрать соответствующий пункт в меню «Пуск» либо его аналогах. Во времена, когда возникла наша проблема, графический интерфейс пользователя оставался делом светлого будущего, а программы запускались из командной строки. При таком способе работы пользователь взаимодействует с интерактивной командной оболочкой – специальной программой, которая принимает вводимые с клавиатуры команды и выполняет их – либо самостоятельно, либо с помощью ядра ОС и других программ. Для запуска программы необходимо ввести имя запускаемого файла и нажать <Enter>.

Но все это лишь верхушка айсберга. Давайте посмотрим, что происходит «под капотом» (в оболочке, системных библиотеках и ядре ОС) после клика на иконку программы или ввода ее имени в командной строке.

В классическом случае двоичных скомпилированных программ процесс запуска подразумевает загрузку кода программы и ее данных в оперативную память и передачу управления в точку входа программы. Всем этим занимается ядро ОС, а для удобства взаимодействия с ядром часто предоставляются дополнительные системные библиотеки. Ядра и библиотеки большинства ОС (и нынешних, и сорокалетней давности) для запуска программ предоставляют набор системных вызовов exec(), которым в качестве аргумента передается имя файла программы. Эти функции уже много лет определяются стандартом POSIX.

Однако программы бывают не только бинарные. С первых версий UNIX оболочка Bourne Shell, с которой взаимодействовали операторы ЭВМ, предоставляла возможность создания скриптов на специальном языке. Язык этот так и назвали – язык Shell. Подобная функциональность стала популярна (и остается таковой по сей день) для решения повседневных рутинных задач как программистов, так и администраторов. Как оказалось, справиться со многими задачами можно скриптом в несколько строчек на языке Shell, причем скрипт не надо перекомпилировать при каждом изменении и держать для этого в системе компилятор.

Изначально для запуска скрипта с помощью интерпретатора необходимо было явно вызвать этот интерпретатор, передав ему имя скрипта в качестве аргумента. Например, в случае Shell, интерпретатор – это программа /bin/sh. Но можно указать просто sh, поскольку директория /bin традиционно включена в переменную PATH и просматривается при попытке определить местоположение запрошенной программы:

$ sh ./script.sh

Однако пользователи и администраторы – народ ленивый, а лень, как известно, – двигатель прогресса. И вполне естественно, что возникло желание запускать Shell-скрипты как обычные программы, то есть просто вводя их имя и нажимая <Enter>.

Первая реализация

Первая реализация такой возможности не заставила себя долго ждать и была достаточно примитивной – оболочка Bourne Shell в первую очередь пыталась «скормить» запускаемый файл ядру ОС. Если же ядро возвращало ошибку NOEXEC, означающую, что ему не удалось распознать формат файла, то оболочка пыталась передать файл интерпретатору sh, например, с помощью вызова execl(), который в случае успеха замещает исходный процесс новым:

execl(program, basename(program), (char *)0);

if (errno == ENOEXEC)

execl ("/bin/sh", "sh", "-c", program, (char *)0);

perror(program);

return -1;

На первых порах такой реализации было достаточно. Но по мере развития UNIX и компонентов ОС выяснилось, что такой прямолинейный подход хотя и прост в реализации, но не отличается масштабируемостью и универсальностью.

Статью целиком читайте в журнале «Системный администратор», №12 за 2013 г. на страницах 82-85.


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-45
E-mail: sa@samag.ru