Скачать 152.79 Kb.
|
ВведениеСистемные вызовы и библиотеки UnixГраница между системным и прикладным программированием достаточно условна. Любой программист так или иначе вынужден пользоваться сервисами операционной системы. Эти сервисы могут быть скрыты от программиста средой исполнения языка высокого уровня или различными «кроссплатформенными» библиотеками и фреймворками. Однако абстракции, представляемые средой исполнения и библиотеками неидеальны, они «протекают». Главные направления таких протечек — это, в первую очередь, производительность и процесс отладки. Когда программа работает не так, как запланировано — это может происходить как из-за ошибки в библиотеке, так и, чаще, из-за ошибочного использования библиотеки — в процессе отладки часто приходится спускаться на низкий уровень и анализировать происходящее не в терминах объектов и шаблонов ЯВУ, а в терминах указателей и системных вызовов. Поэтому знакомство с системным программированием может оказаться полезным и для тех, кто собственно системным программированием заниматься не планирует. С точки зрения программиста на относительно низкоуровневом языке, таком, как C, сервисы ОС выглядят как набор функций, предоставляемых системными библиотеками, и собственно системные вызовы. Системные вызовы — это обращения к ядру операционной системы. В ОС, поддерживающих виртуальную память, пользовательский код не может самостоятельно исполнять ряд операций, в том числе — выполнять операции ввода-вывода, обращаться к структурам данных ОС и к памяти других процессов. Системный вызов включает в себя переход в системный (привилегированный) режим работы процессора, передачу управления ядру и копирование параметров в память ядра. Ядро проверяет наличие прав на исполнение запрошенной операции и, если права есть, исполняет саму операцию. Главные функции, выполняемые системными вызовами, включают в себя ввод-вывод (в том числе доступ к файловой системе и к сети), межпроцессное взаимодействие и доступ к настройкам системы и глобальным данным, например, к показаниям системных часов. Функции стандартной системной библиотеки исполняются в пользовательском режиме работы процессора. Некоторые из функций могут содержать внутри себя один или несколько системных вызовов, некоторые другие полностью работают в пользовательском режиме. Задачи функций библиотеки отличаются большим разнообразием. Некоторые из функций, такие, как буферизованный ввод-вывод (известный также как библиотека стандартного ввода-вывода) пытаются сократить количество системных вызовов. Системные вызовы — относительно более дорогая операция, чем простой вызов функции, поэтому, например, считывать данные из файла или с терминала по одному символу считается нежелательным. Библиотека предоставляет буфер в пользовательской памяти, к которому программа может обращаться удобным для нее образом, например, считывая по одному символу или по строкам. Когда буфер опустеет или, наоборот, заполнится, библиотека исполняет системный вызов и считывает или записывает новую порцию данных. Другие библиотечные функции предоставляются для удобства или для совместимости со старыми версиями ОС или для обеспечения соответствия стандартам. Системы семейства UnixГраницы семейства Unix точно не определены. В это семейство входят операционные системы, архитектура и/или доступные пользователю сервисы которых, в основном, унаследованы от оригинальной ОС Unix, разработанной Д.Томпсоном и К.Ритчи в начале 1970х в Bell Laboratories (в то время — исследовательское подразделение компании AT&T). В первом приближении, ОС семейства Unix можно разбить на следующие группы:
Более подробное описание истории семейства Unix и различий между основными ветвями семейства приведено в приложении «История Unix». Различия между разными системами семейства Unix, как на уровне внутренней организации, так и на уровне внешних интерфейсов, конечно же, существуют, так что нельзя сказать, что, изучив одну ОС, вы изучили их все. Однако существуют стандарты, которым, в той или иной мере, пытаются поддерживать все ОС семейства. Знание этих стандартов позволяет разрабатывать переносимое программное обеспечение и значительно облегчает изучение конкретных ОС. СтандартыЗа время существования семейства Unix был предпринят ряд попыток стандартизовать системные интерфейсы, чтобы облегчить перенос программного обеспечения между разными системами семейства. В настоящее время, наиболее влиятельный из стандартов — это Single Unix Specification, документ, принятый и поддерживаемый консорциумом Open Group (http://www.opengroup.org). Этот документ имеет также статус стандарта IEEE Std 1003 (POSIX) и ISO/IEC 9945. Стандарт SUS/POSIX специфицирует API (Application Programming Interface), то есть интерфейс, доступный прикладному программисту. Этот стандарт обеспечивает совместимость на уровне исходного кода на языках C/C++. Адаптация программы к другой реализации стандарта может потребовать (и, обычно, требует) перекомпиляции. Так, API определяет минимальный набор полей в структурах данных, но не указывает, может ли структура содержать другие поля и в каком порядке эти поля должны быть размещены в структуре; API допускает реализацию функции как в виде, собственно, функции языка C, так и в виде препроцессорного макроса. Практика показала, что стандарт SUS/POSIX обеспечивает достаточно большую свободу в выборе методов реализации, так что даже многие ОС, не входящие в семейство Unix, например, IBM z/OS или HP OpenVMS, декларируют ту или иную степень совместимости с POSIX. Кроме API, существует более низкий уровень спецификации системных интерфейсов, называемый ABI (Application Binary Interface). ABI включает в себя:
ОС, предоставляющие совместимые ABI, не требуют перекомпиляции пользовательских программ, то есть обеспечивают бинарную совместимость. Обычно, бинарная совместимость обеспечивается в пределах одной линии ОС: новые версии бинарно совместимы со старыми. ОС Unix System V, в том числе Solaris, поддерживают стандарт iBCS (Intel Binary Compatibility Standart). В этом курсе мы будем изучать стандарт SUS/POSIX на примере его реализации Unix System V Release 4, например, Solaris. Системные вызовыСистемные вызовы - это интерфейс между пользовательским процессом и операционной системой. Существуют системные вызовы для: . Ввода/вывода: например, read, write и ioct . Управления файлами: например, chmod, unlink и mknod . Доступа к системным данным: например, getuid и getpid . Управления процессами и их синхронизации: например, signal, wait и semop . Управления памятью: например, brk, sbrk и mmap В Unix, все системные вызовы имеют функции-«обертки» в стандартной библиотеке языка C, так что системные вызовы можно вызывать как обычные функции языка C. Многие из системных вызовов принимают аргументы; также, многие вызовы возвращают значение. Обычно, возвращаемое значение -1 сигнализирует об ошибке. В этом случае, системный вызов (точнее, его функция-обертка) размещает код ошибки в переменной errno (в многопоточных программах, в действительности, это не переменная, а препроцессорный макрос, но этот макрос является lvalue, т. е. ему можно присваивать значения и получать указатель на него). Во многих старых учебниках рекомендуют описывать errno как extern int errno, но для совместимости с многопоточными программами рекомендуется использовать определение, предоставленное в заголовочном файле . Переменная errno устанавливается при ошибках; в соответствии со стандартом POSIX, системный вызов имеет право изменять errno при успешном завершении, поэтому при успешном вызове значение errno следует считать неопределенным. По этой же причине, не следует ориентироваться на значение errno для проверки успешности системного вызова. Многие библиотечные функции, содержащие внутри системный вызов, также устанавливают errno. Для всех допустимых значений errno в заголовочном файле определены символьные константы, которые соответствуют мнемоническим именам ошибок. В разных Unix-системах номера ошибок могут различаться, поэтому, при анализе значения errno следует использовать эти константы, а не численные значения. Это значительно облегчит адаптацию вашей программы к другим ОС. Организация системного руководстваСистемное руководство Unix доступно из командной строки через команду man(1). При каждом вызове, команда man выдает содержимое указанной страницы руководства, например, команда man man выдает руководство по самой команде man. Существуют также графические программы для просмотра системного руководства, например, xman(1). В системном руководстве описаны все системные вызовы, все функции стандартной библиотеки и других библиотек, входящих в поставку системы, все команды, доступные из командной строки и ряд другой информации. Руководство разделено на пять секций: 1 Команды, доступные из командной оболочки shell (подсекция 1M — команды, требующие административных привилегий) 2 Системные вызовы. 3 Функции и библиотеки. Этот раздел имеет ряд подсекций, в том числе: 3C Библиотечные функции, реализованные на Си или ассемблере, составляющие стандартную библиотеку языка Си. Эти функции содержатся либо в /usr/libc.so (для разделяемых библиотек), либо в /usr/lib/libc.a (для архивных библиотек). В Solaris 9, архивной версии библиотеки libc.a не предоставляется. При компиляции программы на языке C, редактор связей автоматически подключает одну из этих библиотек. 3G Библиотечные функции общего назначения. Необходима опция -lgen в командной строке cc для поиска в библиотеке /usr/lib/libgen.so. 3M Математические библиотечные функции, образующие математическую библиотеку. Необходима опция -lm в командной строке компилятора. Объявления этих функций могут быть получены из . 3X Специализированные библиотечные функции. Распределены по нескольким библиотекам. Прочитайте соответствующую страницу Руководства, чтобы определить библиотеку, которая должна быть задана. 4 Форматы файлов, описывает форматы системных файлов. Например, passwd(4) описывает формат файла /etc/passwd, в котором хранится БД учетных записей. 5 Остальные средства. Например, карта символов ASCII на странице ASCII(5), полезные сведения о системном вызове fcntl(2) на FCNTL(5), полезные сведения о системном вызове wait(2) на WSTAT(5), сведения о сигналах на страницах SIGINFO(5) и SIGNAL(5). Использование системного руководстваСсылки на системное руководство в тексте учебного пособия, а также и в самом системном руководстве, выглядят так: name(section), где name — имя страницы, а section — номер или название секции. Основным средством доступа к системному руководству является команда man(1). Простейший вызов этой команды выглядит так: man ls. Эта форма команды выдает страницу руководства по команде ls(1). Если необходимо указать секцию руководства, в Solaris необходимо использовать форму команды man -s 2 read — эта форма команды выдает страницу read(2). Чаще всего, секцию руководства необходимо указывать, когда в разных секциях существуют одноименные страницы, например, read(1) (комадна shell) и read(2) (системный вызов) или passwd(1) (команда shell для смены пароля) и passwd(4) (формат файла БД учетных записей). При выводе на терминал, команда man пропускает вывод через фильтр more(1), позволяющий листать текст по страницам, а также искать в тексте строки, используя шаблоны (регулярные выражения). По умолчанию, прокрутка на одну строку делается нажатием , а прокрутка на страницу (на один экран терминала) — нажатием пробела. Перемещение на строку назад делается символом 'b', а на страницу — Ctrl-B. Для поиска необходимо ввести символ /, шаблон для поиска и . Для повторного поиска того же шаблона можно ввести /. Синтаксис шаблона аналогичен шаблонам, используемым командами grep(1) и sed(1), а также многими программистскими редакторами, такими, как vi/vim, emacs, gedit, NetBeans, Eclipse. Большинство символов соответствуют самим себе. Cимвол '.' соответствует любому символу, символ '*' соответствует нулю или более вхождений предыдущего выражения (например, предыдущего символа), '+' - одному или более вхождениям. Выражение в квадратных скобках задает диапазон символов, например, [0-9] соответствует любой десятичной цифре. Точный синтаксис регулярных выражений, поддерживаемых more(1), может быть найден на странице руководства regex(5) Для выхода из more(1) (при этом команда man также завершается) можно использовать команду 'q' (quit). По умолчанию, man(1) ищет страницы руководства в каталоге /usr/share/man, где расположены страницы, входящие в стандартную поставку системы. Для просмотра руководства по дополнительным пакетам, например, по компилятору SunStudio, может быть необходимо подключить дополнительные каталоги для поиска. Это может быть сделано опцией -M, например, команда man -M /opt/SolarisStudio12.3-solaris-x86-bin/solarisstudio12.3/man cc выдаст руководство по компилятору языка C из пакета SunStudio (точное значение параметра -M должно соответствовать местоположению пакета SunStudio в вашей системе). Также, вместо параметра -M дополнительные каталоги можно подключать при помощи переменной среды MANPATH. Еще одна полезная команда, связанная с man(1) — это команда apropos(1). Эта команда осуществляет поиск по заголовкам страниц руководства. Так, apropos file выводит список всех страниц руководства, в заголовке (точнее, в секции NAME) которых содержится подстрока file. У ряда Unix-систем, в том числе у Solaris, страницы системного руководства выложены в Интернет в виде веб страниц, у Solaris — на сайте http://docs.oracle.com. При использовании интернет-версий, необходимо внимательно следить, соответствуют ли страницы на сайте вашей версии системы. На сайте Oracle доступны руководства от всех версий Solaris, начиная с 2.4. Формат страницы Руководства. ЗАГОЛОВОК (TITLE) - обычно имя библиотечной функции или системного вызова . СЕКЦИЯ (SECTION) - раздел Руководства . БИБЛИОТЕКА (LIBRARY) - для секции 3, библиотечных функций, например C, S, M, E, X или G. . ИМЯ (NAME) - имя и краткое описание системного вызова или библиотечной функции (в одной строке) . ИСПОЛЬЗОВАНИЕ (SYNOPSIS) - как вызвать системный вызов/библиотечную функцию. Для функций библиотек языка C и системных вызовов в этой секции указан прототип функции, а также все заголовочные файлы, которые необходимо включить для корректной работы с функцией, например, те, где описан прототип функции и типы, используемые этой функцией в качестве параметров или кода возврата. . ОПИСАНИЕ (DESCRIPTION) - описывает работу системного вызова или функции. Часто, самый длинный раздел руководства. . ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ (RETURN VALUE) - как интерпретировать возвращаемый код. . ОШИБКИ (ERRORS) — для системных вызовов и библиотечных функций, использующих системные вызовы, перечисляет все допустимые значения errno и их значение. . СМ. ТАКЖЕ (SEE ALSO) - страницы Руководства, имеющие отношение к этой странице. . АТРИБУТЫ (ATTRIBUTES) — стандарты, которым соответствует функция, а также особенности при использовании в многопоточной программе и при работе с длинными файлами (файлами, длина которых превышает 2Гб) Кроме того, страница Руководства может содержать разделы: . ПРИМЕРЫ (EXAMPLES) . ФАЙЛЫ (FILES) . СООБЩЕНИЯ (DIAGNOSTICS) . ЗАМЕЧАНИЯ (NOTES) . (ПРЕДУПРЕЖДЕНИЯ) WARNINGS . (ОШИБКИ) BUGS . (ПРОБЛЕМЫ) CAVEATS Пример страницы Руководства (секция 3)Библиотечные функции перечислены в Секции 3. (3C) означает что эта функция размещена в стандартной библиотеке Cи (в /usr/lib/libc.so). ИМЯ имя функции и краткое описание. ИСПОЛЬЗОВАНИЕ соответствующий include-файл и объявление функции perror. Объявление говорит, что perror(3C) ничего не возвращает (void) и требует один аргумент. Аргумент должен быть адресом символа, в данном случае - адресом символьной строки, оканчивающейся нулевым байтом. ОПИСАНИЕ работа функции. perror(3C) печатает текст, переданный в качестве аргумента, затем двоеточие и пробел, затем сообщение об ошибке по текущему значению errno и перевод строки. Описание сообщений об ошибках можно найти на странице Руководства INTRO(2) и в файле , а также в разделе ERRORS страниц руководства по системным вызовам. Сообщение об ошибке может быть включено в отформатированную пользователем строку при помощи strerror(3C). Эта функция возвращает указатель на сообщение об ошибке по значению errno. Эта функция использует внешнюю переменную errno как индекс во внешнем массиве, называемом sys_errlist[]. Это массив указателей на различные сообщения об ошибках, связанных со значением errno. Эти две переменные описываются на странице STRERROR(3C). Пример: printf("A %s caused the error\n", strerror(errno)); Пример страницы Руководства (Секция 2)ИМЯ название системного вызова и однострочное описание ИСПОЛЬЗОВАНИЕ необходимые include-файлы. time(2) возвращает значение типа time_t, представляющее время в секундах с 1 января 1970 года, 00:00:00 UTC. time требует один параметр, адрес time_t. Тип time_t представляет собой typedef, определенный в . Если параметр ненулевой, возвращаемое значение также запоминается по адресу, заданному в качестве параметра. ОПИСАНИЕ указывает, что time(2) возвращает значение time_t, соответствующее текущему времени, измеренному в секундах с 1 января 1970 года, 00:00:00 UTC. time(2) возвращает -1 в случае неуспеха. Некоторые системные вызовы могут по различным причинам завершаться неудачно. Многие страницы Руководства перечисляют коды ошибок, начинающиеся с буквы 'E', которые обозначают конкретную причину неуспеха. На 32-битных платформах, time_t определен как 32-битное целое. 19 января 2038 года в 03:14:07 UTC 32-битный time_t должен переполниться. Это известно как «Проблема 2038 года». На 64-битных платформах используется 64-битный time_t и этой проблемы не существует. Официальная позиция Oracle состоит в том, что ни одна из 32-битных версий ОС, поддерживаемых Oracle, не имеет ожидаемого срока жизни, достигающего 2038 года, поэтому на 2012 год решения для 32-битных ОС не предлагается. Поскольку можно предположить, что к 2038 году значительное число встраиваемых и портативных устройств по прежнему будет использовать 32-битные процессоры, можно ожидать появления переходного ABI, аналогичного переходному ABI для использования 64-битного off_t в 32-битных программах (ABI для 64-битного off_t будет обсуждаться в разделе «Системные вызовы ввода-вывода»)ю ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ объясняет значения, возвращаемые при успехе или неуспехе. СМ. ТАКЖЕ перечисляет функции или системные вызовы, имеющие отношение к данному. stime(2) используется суперпользователем для установки часов. ctime(3C) используется для преобразование значения time(2) в удобный для человека формат. Примеры использования time(2)На следующей странице приведены примеры различных способов использования системного вызова time. . описания и инициализации. Должны быть включены файлы, перечисленные в Руководстве. Они объявляют системный вызов time(2) и описывают typedef time_t. Описаны четыре переменные типа time_t и указатель на time_t. При этом указатель инициализируется. . нулевое значение параметра time(2) означает, что должно использоваться возвращаемое значение. Под результат не было выделено памяти, и предполагается использовать возвращаемое значение. . инициализированный указатель в качестве аргумента. Время будет сохранено в ячейке памяти, на который указывает переменная tp. Поскольку tp инициализирован, *tp совпадает с переменной t2. Кроме того, то же самое значение будет присвоено t3. . адрес переменной в качестве аргумента. Прочитанное значение системных часов будет помещено в переменную типа time_t. Преобразование типа возвращаемого значения в void означает, что возвращаемое значение не будет использоваться. ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ time(2). объявления и инициализации #include #include time_t t1, t2, t3, t4; time_t *tp = &t2; . нулевое значение параметра time(2) означает, что должно использоваться возвращаемое значение t1 = time ( 0 ); . инициализированный указатель в качестве аргумента t3 = time ( tp ); . адрес переменной в качестве аргумента (void) time ( &t4 ); Пример страницы Руководства (Секция 3)В разделе ИСПОЛЬЗОВАНИЕ описано несколько функций. . Должен быть включен файл . . ctime, localtime и gmtime все требуют по одному параметру. Это адрес переменной или поля структуры типа time_t. Значение этой переменной может быть установлено обращением к time(2). - ctime возвращает адрес символа. Это адрес начала символьной строки, завершающейся нулевым символом. Формат строки не зависим от настроек языка. Для вывода даты и времени на национальном языке необходимо использовать функции strftime(3C) и strptime(3C). - localtime и gmtime возвращают адрес структуры tm. Раздел ОПИСАНИЕ описывает возвращаемое значение и элементы структуры tm. Замечания: 1. localtime сначала вызывает tzset, чтобы получить значение переменной среды TZ. На основании этого значения tzset инициализирует массив указателей на строки tzname и внешние переменные timezone и altzone. timezone устанавливается равной разнице времени между UTC и данной временной зоной, измеренному в секундах. Например, в Нью Джерси, tzname[0] == "EST" и timezone == 5*60*60 tzname[1] == "EDT" и altzone == 4*60*60 2. Поле tm_isdst структуры tm при вызове функций localtime и gmtime устанавливается положительным, если действует сезонное изменение времени, нулевым, если оно не действует, и отрицательным, если информация недоступна. 3. Внешняя переменная daylight устанавливается положительной, только если в данной TZ используется сезонное изменение времени. 4. localtime реализована следующим образом: она вычитает timezone из прочитанного значения time и вызывает gmtime. Раздел ПРОБЛЕМЫ говорит о «перезаписи» содержимого: функции ctime, asctime, localtime и gmtime возвращают указатель на внутренний буфер. Содержимое этого буфера может быть перезаписано последующим вызовом соответствующих функций. 5. В разделе АТРИБУТЫ указано, что функции ctime, asctime, localtime и gmtime в Solaris 10 возвращают указатели на локальные данные нити, и поэтому являются безопасными для использования в многопоточной программе (в каждой нити эти функции будут возвращать разные указатели). Тем не менее, использование этих функций не рекомендуется, потому что стандарт POSIX не требует, чтобы эти функции были безопасны в многопоточных программах. Рекомендуется использовать реентерабельные версии этих функций: localtime_r, gmtime_r и т.д. Также указано, что сами по себе функции безопасны, но прямая модификация переменных timezone, altzone и daylight во время работы этих функций может приводить к непредсказуемым результатам. Библиотечная функция mktime(3C) может быть использована для преобразования структуры tm в календарное время (количество секунд с 00:00:00 1 января 1970). Библиотечная функция difftime(3C) возвращает разницу между двумя календарными временами как double. Эта функция нужна, потому что, в соответствии с требованиями POSIX, для типа time_t может быть не определено основных арифметических операций. Пример использования time(2) и ctime(3C)Эта программа демонстрирует использование time(2) и ctime(3C). Она работает следующим образом: 9 Определяет переменную now типа time_t. 10 Определяет указатель sp на struct tm. 12 Вызывается time(2). Время в секундах от 00:00:00 UTC 1 января 1970 сохраняется в переменной now. 14 Библиотечная функция ctime(3C) преобразует календарное время в ASCII-строку формата date(1). Адрес, возвращенный этой функцией, используется в качестве параметра printf для печати ASCII-строки. 16 Вызывается библиотечная функция localtime(3C). Эта функция заполняет значениями поля структуры tm. 17-20 Распечатываются значения полей структуры tm. Файл: ex_time.c ПРИМЕР ИСПОЛЬЗОВАНИЯ time(2) И ctime(2) 1 #include 2 #include 3 #include 4 #include 5 extern char *tzname[]; 6 7 main() 8 { 9 time_t now; 10 struct tm *sp; 11 12 (void) time( &now ); 13 14 printf("%s", ctime( &now ) ); 15 16 sp = localtime(&now); 17 printf("%d/%d/%02d %d:%02d %s\n", 18 sp->tm_mon + 1, sp->tm_mday, 19 sp->tm_year, sp->tm_hour, 20 sp->tm_min, tzname[sp->tm_isdst]); 21 exit(0); 22 } |
Учебное пособие представляет изложение материала по теме «Системные вызовы ос unix» Иртегов Д. В. Системные вызовы и библиотеки Unix System V release Учеб пособие / Новосиб гос ун-т. Новосибирск, 2013. – 449 с |
Рабочая программа учебной дисциплины операционные системы unix unix operational System Целью учебных занятий курса «Операционные системы Unix» является получение теоретического материала и приобретение навыков в использовании... |
||
Операционная система linux Самым популярным проектом unix-системы конца XX века стала недорогая альтернатива дорогостоящим (hp-unix, sun solaris, Digital unix)... |
Самым популярным проектом unix-системы конца XX века стала недорогая... Самым популярным проектом unix-системы конца XX века стала недорогая альтернатива дорогостоящим (hp-unix, sun solaris, Digital unix)... |
||
Статья из рубрики "Вызовы и угрозы международной безопасности" Шитова Е. Н. Методы борьбы с коррупцией в Бразилии: достижения и новые вызовы // nb: Международные отношения. 2015. № С. 123-143.... |
Unix-подобная операционная система ... |
||
Тема сетевые операционные системы unix Цель темы: дать классификацию современных сетевых операционных систем и раскрыть принципы функционирования операционных систем семейства... |
Результаты анкетирования читателей библиотеки спбгасу В ноябре 2016г в Спбгасу проводилось анкетирование читателей библиотеки с целью изучения информационных потребностей читателей и... |
||
Xx международная научно-техническая конференция и Российская научная... Системные проблемы надёжности, качества, компьютерного моделирования, информационных и электронных технологий в инновационных проектах... |
Программа Конференции Пленарное заседание Современная регуляторная... Современная регуляторная система в сфере обращения лекарственных средств – глобальные тренды, вызовы, возможности |
||
Программа развития школьной библиотеки «Мой мир –книга» Охватывает ведение справочно-библиографического аппарата библиотеки, и дает возможность учащимся получить навыки независимого пользователя... |
Библиотеки искусств Стратегические подходы к планированию деятельности 2017 года определены задачами дальнейшей модернизации базовых сегментов и развитием... |
||
Новые пользователи unix и Linux могут быть ошеломлены размерами и... Но ни одна из этих книг не обсуждает особенности Linux. Хотя 95% всего связанного с использованием Linux абсолютно аналогично другим... |
Инструкция по подключению Системные требования: Windows Системные требования: Windows 32 бит ( xp, Vista, Windows 7) или Windows x64 бит (xp x64, Vista x64, Windows 7 x64). Минимальная... |
||
Действующего на основании Устава, с одной стороны, и Общество с ограниченной... Системные Решения, именуемый(-ое) в дальнейшем Поставщик, в лице Директора Вележинской Елены Юлиановны, действующего на основании... |
Публичные библиотеки обеспечивают городским и сельским жителям свободный... Деятельность современной библиотеки в наше сложное время – время социальных, экономических |
Поиск |