учебники, программирование, основы, введение в,

 

Заключение

Основные идеи курса
Один из общепринятых способов обеспечения мобильности ПО - стандартизация окружения приложений: предоставляемых программных интерфейсов, утилит и т.п. На уровне системных сервисов подобное окружение описывает стандарт POSIX. Стандарт POSIX-2001 включает в себя четыре части:

  1. основные определения (общие для всех частей термины, концепции и интерфейсы);
  2. описание прикладного программного c-интерфейса к системным сервисам;
  3. описание интерфейса к системным сервисам на уровне командного языка и служебных программ;
  4. детальное разъяснение положений стандарта, обоснование принятых решений.

Стандарт POSIX описывает множество базовых, системных сервисов, необходимых для функционирования прикладных программ. Доступ к ним предоставляется посредством интерфейса, специфицированного для языка C, командного языка и общеупотребительных служебных программ.
Основная цель стандарта POSIX - сделать приложения мобильными на уровне исходного языка по отношению к смене аппаратно-программной платформы. О мобильности выполнимых программ и/или объектных файлов речь не идет.
POSIX нейтрален по отношению к системной архитектуре и разрядности процессора. Это очень важный аспект мобильности приложений.
Стандарт POSIX не ограничен рамками Unix-среды. Существуют и другие операционные системы (например, системы реального времени), предоставляющие необходимые сервисы и тем самым поддерживающие выполнение POSIX-совместимых приложений. Можно утверждать, что следование стандарту POSIX облегчает перенос приложений практически на любую сколько-нибудь распространенную операционную платформу.
В стандарте POSIX проведено разделение на обязательные и дополнительные системные сервисы, причем обязательное ядро сделано по возможности компактным. Для рассмотрения в данном курсе были отобраны в основном обязательные возможности; другие (среди которых выбирались давно устоявшиеся, присутствующие во многих исторически сложившихся реализациях) привлекались только тогда, когда явно не хватало функциональности для создания приложений.
Основная задача курса - рассмотрение приемов и методов использования стандартизованных служебных программ и функций. Не ставилась цель пересказать стандарт, осветив все тонкости реализации ОС, все возможные коды ошибок и т.п. Главное, на наш взгляд, прочувствовать дух стандарта, научиться мобильным образом применять заложенные в нем возможности.
Предполагается, что читатель владеет языком C; мы не рассматривали ни синтаксис, ни хрестоматийные библиотечные функции этого языка. По отношению к стандартному командному языку и его интерпретатору аналогичного предположения не делалось. Эта тема изложена довольно подробно, хотя многие практикующие программисты предпочитают пользоваться другими интерпретаторами.
Мы не противопоставляли программирование на уровне командного языка и языка С. И то, и другое, порознь или совместно, может служить адекватным инструментом реализации приложений. Соответственно, рассматриваемые интерфейсы группировались по их предметной направленности, а не по языку реализации.
Значительное место в курсе и по объему, и по роли отведено примерам программ. Многие положения стандарта (связанные, скажем, с обработкой ошибочных ситуаций) излагаются не в основном тексте, а в этих примерах. По возможности они компилировались и выполнялись на нескольких аппаратно-программных платформах, в той или иной степени претендующих на соответствие стандарту POSIX. Тем не менее, недосмотры, конечно, возможны. Мы будем признательны за все замечания и предложения, относящиеся как к курсу в целом, так и к отдельным примерам программ.
Основные понятия, рассматриваемые в курсе
Важнейшим является понятие соответствия стандарту POSIX. У него есть две стороны: соответствие реализации (операционной системы) и соответствие приложения.
Реализация (операционная система), соответствующая стандарту POSIX, должна поддерживать все обязательные служебные программы, функции, заголовочные файлы с обеспечением специфицированного в стандарте поведения.
Для приложений предусмотрено как строгое соответствие (его главный отличительный признак - ограничение круга используемых возможностей рамками стандарта), так и соответствие с использованием расширений.
Профилем называется набор опций, описывающих необязательные возможности. Соответствие профилю означает соответствие стандарту POSIX и поддержку заданных возможностей. Разумным образом выбранные профили позволяют учитывать потребности представительных классов пользователей и/или приложений.
Допускается существование "подпрофилей", описывающих подмножества стандартных возможностей. Реализация, соответствующая подпрофилю, может функционировать на аппаратных платформах с ограниченными ресурсами и/или обслуживать нужды специфических приложений.
К числу важнейших принадлежат понятия, описывающие поведение реализации в различных ситуациях. Для многих корректных ситуаций поведение может быть неспецифицированным; это значит, что мобильное приложение не должно полагаться на совпадение поведения разных реализаций. Для некорректных ситуаций возможно неопределенное поведение; приложение не только не должно полагаться на определенный характер подобного поведения - оно не должно совершать некорректных действий, вызывающих неопределенное поведение.
Еще один близкий термин - "поведение, зависящее от реализации" - дополнительно означает, что поведение реализации необходимо документировать.
Стандарт POSIX в редакции от 2003 года - весьма обширный, многогранный документ. Для настоящего курса были отобраны следующие основные понятия операционных систем:

  • пользователь;
  • файл;
  • процесс;
  • терминал;
  • хост;
  • узел сети;
  • время;
  • языково-культурная среда.

За пределами рассмотрения оставлены такие важные и сложные темы:

  • средства разработки;
  • средства реального времени;
  • потоки управления;
  • математические интерфейсы;
  • пакетные сервисы;
  • унаследованные интерфейсы.

В тексте стандарта POSIX можно найти следующие пояснения рассматриваемых в курсе основных понятий вместе со ссылками на атрибуты и операции.

  1. У пользователя есть имя и числовой идентификатор.
  2. Файл - объект, допускающий чтение и/или запись и имеющий такие атрибуты, как права доступа и тип. В число типов входят обычный файл, символьный и блочный специальные, канал, символьная ссылка, сокет и каталог. Реализация может поддерживать и другие типы файлов.
  3. Процесс - адресное пространство вместе с выполняемыми в нем потоками управления и необходимыми для этих потоков системными ресурсами.
  4. Терминал (или терминальное устройство) - символьный специальный файл, подчиняющийся спецификациям общего терминального интерфейса.
  5. Сеть - совокупность взаимосвязанных хостов.
  6. Языково-культурная среда - часть пользовательского окружения, зависящая от языковых и культурных соглашений.

Основными операциями, применимыми к объектам ОС, являются чтение, запись и выполнение. Механизм прав доступа позволяет избирательно разрешать и запрещать выполнение подобных операций.
В posix-совместимых ОС определены объекты, которые можно назвать вспомогательными; они помогают организовать взаимодействие между основными сущностями. Особенно широк спектр средств межпроцессного взаимодействия.

http://localhost:3232/img/empty.gifСредства, обслуживающие понятие пользователя

Операционная система, соответствующая стандарту POSIX, должна поддерживать базу данных пользователей, в которой о каждом из них хранится по крайней мере следующая информация:

  • имя пользователя;
  • числовой идентификатор пользователя;
  • числовой идентификатор начальной группы;
  • начальный рабочий каталог;
  • начальная программа пользователя.

Над базой данных пользователей определены операции поиска по идентификатору или имени пользователя, реализуемые, соответственно, функциями getpwuid() и getpwnam().
Пользователи объединяются в группы; каждый является членом по крайней мере одной группы. Для групп, как и для пользователей, существует база данных, записи которой содержат по крайней мере следующие поля:

  • имя группы;
  • числовой идентификатор группы;
  • список пользователей, которым разрешено становиться членами данной группы.

Имеются функции для поиска в базе данных групп - getgrgid() и getgrnam().
Опросить ассоциированные с пользователем данные позволяет служебная программа id.
Входное имя текущего пользователя можно узнать также с помощью утилиты logname и функции getlogin().
Для смены текущей группы пользователя предназначена служебная программа newgrp.
Чтобы узнать, какие пользователи в данный момент активны и за какими терминалами они работают в системе, можно воспользоваться служебной программой who.
Утилиты write, talk и mesg позволяют в ограниченной форме организовать взаимодействие между пользователями.
Базовым средством обеспечения почтового взаимодействия, согласно стандарту POSIX-2001, является служебная программа mailx.

http://localhost:3232/img/empty.gifСредства, обслуживающие понятие файла

В трактовке стандарта POSIX понятие файла охватывает все, что может содержать, потреблять и/или поставлять информацию. Файл имеет такие атрибуты, как тип, имя и режим.
В стандарте зафиксированы следующие типы файлов:

  • обычный файл;
  • каталог;
  • канал;
  • символьный специальный файл;
  • блочный специальный файл;
  • символьная ссылка;
  • сокет.

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

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

По отношению к конкретному файлу все пользователи делятся на три категории:

  • владелец файла;
  • члены владеющей группы;
  • прочие пользователи.

Для каждой из этих категорий режим доступа определяет права на операции с файлом, а именно:

  • право на чтение;
  • право на запись;
  • право на выполнение (для каталогов - право на поиск).

Для выполнения большинства операций с файлами их необходимо открыть. Открытому файлу соответствует файловый дескриптор - неотрицательное целое число, уникальное в пределах процесса и используемое для целей доступа к файлу. Дескриптор является ссылкой на описание открытого файла, хранящее смещение в файле, его статус и режимы доступа.
Для получения информации о файлах и файловых системах, а также для смены их атрибутов предназначены следующие служебные программы и функции:

  • утилита pwd и функция getcwd() позволяют опросить абсолютное маршрутное имя текущего каталога;
  • утилита ls и функции семейства stat() (stat(), fstat(), lstat()) выдают информацию о файлах;
  • утилита df и функции fstatvfs() и statvfs() обеспечивают получение интегральной информации о файловых системах;
  • служебная программа du выдает информацию о суммарном объеме пространства, занятого иерархиями файлов;
  • утилита cd и функция chdir() позволяют изменить текущий каталог;
  • утилиты chown и chmod, функции chown(), fchown(), chmod(), fchmod() служат для изменения таких атрибутов файлов, как владелец и режим доступа;
  • утилита touch модифицирует время последнего доступа и/или изменения файла.

Создание обычных файлов обслуживается функцией creat(), создание каталогов - утилитой mkdir и одноименной функцией, создание каналов - утилитой mkfifo и одноименной функцией.
Новые ссылки на файл (жесткие или символьные) создают служебная программа ln, а также функции link() и symlink().
Для удаления файлов служат утилиты rm и rmdir, функции unlink(), rmdir() и remove().
Копирование файлов выполняется служебной программой cp, перемещение - программой mv или функцией rename().
Обход файловой иерархии и систематическую обработку ее элементов осуществляет утилита find.
Одной из форм обхода и обработки файловой иерархии можно считать архивирование. Стандарт POSIX предусматривает для этого служебную программу pax.
В стандарте POSIX-2001 выделены две основные группы функций, обслуживающие операции ввода/вывода:

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

Для открытия файлов и формирования новых описаний открытых файлов, файловых дескрипторов и потоков служат функции нижнего уровня open() и pipe(), а также функции буферизованного ввода/вывода fopen(), fdopen(), freopen().
Для закрытия файлов предназначены функции close() и fclose().
Весьма полезной с практической точки зрения является функция создания и открытия временных файлов tmpfile().
Чтение данных из файла выполняют функции read() и fread(), запись - функции write() и fwrite().
Содержимое символьных ссылок приходится читать особым образом, посредством функции readlink().
Для буферизованного ввода/вывода байт предназначены функции fgetc() и fputc(), строки рекомендуется вводить, вызывая функцию fgets(), а выводить с помощью функций fputs() и puts().
Индикатор текущей позиции файла может быть опрошен или передвинут посредством функции нижнего уровня lseek(), а также функций буферизованного ввода/вывода fseek(), ftell(), ftello(), fgetpos(), fsetpos(), rewind().
Для выполнения разнообразных управляющих операций над открытым файлом ом предназначена функция fcntl().
Особый класс управляющих операций с файлами со своей системой понятий составляют блокировки, хотя они также оформляются как команды функции fcntl().
Функции setbuf(), setvbuf() и fflush() выполняют управляющие операции с буферами потоков.

http://localhost:3232/img/empty.gifhttp://localhost:3232/img/empty.gifСредства обработки структурированных данных

Простейшая разновидность структурированных данных - текстовые файлы. В свою очередь, простейшей операцией с файлами является их выдача на стандартный вывод. Для этого служит утилита cat.
Просмотр больших текстовых файлов предпочтительнее осуществлять при помощи служебной программы more.
Для просмотра нетекстовых файлов рекомендуется служебная программа od.
Полезная возможность - взглянуть на начало файла, она реализуется служебной программой head.
"Симметричная" служебная программа - tail - выдает на стандартный вывод конец исходного файла.
Служебная программа pr является фильтром для печати и оформления страниц.
Для подсчета числа символов, слов и строк в файлах служит утилита wc.
Служебная программа sort в зависимости от заданных опций выполняет одно из трех возможных действий:

  • сортирует строки всех исходных файлов с записью результата в выходной файл;
  • производит слияние всех исходных (предварительно отсортированных) файлов и записывает результат в выходной файл;
  • проверяет, действительно ли отсортирован единственный исходный файл.

Утилита diff сравнивает содержимое исходных файлов и выдает на стандартный вывод список изменений, которые необходимо произвести, чтобы преобразовать один файл в другой.
Если нужно проверить на совпадение два файла, предпочтительнее воспользоваться более простой и быстрой служебной программой cmp.
Еще одним средством выявления различий (и совпадений) текстовых файлов является служебная программа comm.
Для контроля целостности файлов предназначена служебная программа cksum.
Понятие регулярного выражения (РВ) - одно из важнейших для программ обработки текстовых файлов. Согласно стандарту POSIX-2001, регулярное выражение - это шаблон, служащий для выборки определенных цепочек символов из множества подобных цепочек. Говорят, что выбранные цепочки удовлетворяют (успешно сопоставляются с) РВ.
Различают базовые (БРВ) и расширенные (РРВ) регулярные выражения.
Наиболее употребительной служебной программой, использующей механизм регулярных выражений, является grep.
В командных файлах обработка текстов часто производится потоковым редактором sed.
Еще одно популярное средство обработки текстовых файлов - служебная программа awk. Она выполняет программы, написанные на одноименном языке программирования.
На уровне функций работа с регулярными выражениями поддержана семейством regex: regcomp(), regexec(), regfree(), regerror().
Идейно простое, но весьма мощное и полезное средство обработки текстовых файлов - служебная программа преобразования символов tr.
Служебная программа uniq позволяет ужать подряд идущие одинаковые строки до одной.
Стандартом POSIX-2001 предусмотрены аналоги реляционных операций для текстовых файлов:

  • cut - выполняет операцию проекции отношения;
  • paste - осуществляет горизонтальное соединение;
  • join - выдает на стандартный вывод результат соединения двух отношений.

Каталог также можно рассматривать как набор структурированных данных. Обработка каталогов начинается с их открытия. Для этого предназначена функция opendir().
После открытия текущим становится первый элемент каталога. Если в дальнейшем понадобится вновь позиционироваться на первый элемент, можно воспользоваться функцией rewinddir().
Чтение элементов каталога выполняет функция readdir().
После завершения работы с каталогом его следует закрыть с помощью функции closedir().
Нередко сочетаются чтение элементов каталога и сопоставление с шаблоном имен файлов. Подобное сопоставление реализует функция fnmatch().
Для генерации маршрутных имен, удовлетворяющих заданному шаблону, стандартом POSIX-2001 предусмотрена функция glob().
Выделение из маршрутного имени файла простого имени выполняет утилита basename. Маршрутный префикс выделяется служебной программой dirname.

http://localhost:3232/img/empty.gifПроцессы

Согласно стандарту POSIX-2001, процесс - это адресное пространство вместе с выполняемыми в нем потоками управления, а также системными ресурсами , которые этим потокам требуются.
Каждый процесс обладает целым рядом атрибутов. Важнейшим среди них является идентификатор процесса - положительное целое число, однозначно идентифицирующее процесс в течение времени его жизни.
Процесс, создавший данный, называется родительским.
С каждым процессом ассоциируется идентификатор создавшего его пользователя. Этот атрибут называется реальным идентификатором пользователя процесса.
Для определения прав процесса (в том числе прав доступа к файлам) используются действующие идентификаторы пользователя и группы, которые в общем случае могут отличаться от реальных.
Поведение процесса определяется исполняемой в его рамках программой.
Для выдачи информации о процессах служит утилита ps.
Опрос идентификаторов процесса, родительского процесса и группы процессов выполняется посредством функций getpid() и getppid() getpgrp().
Для установки идентификатора группы процессов предназначена функция setpgid().
За создание сеанса и установку идентификатора группы процессов отвечает функция setsid().
Опрос реальных и действующих идентификаторов пользователя и группы вызывающего процесса осуществляется с помощью функций getuid(), geteuid(), getgid(), getegid().
Функция getgroups() предназначена для получения идентификаторов дополнительных групп вызывающего процесса.
Переустановить действующий идентификатор пользователя вызывающего процесса позволяют функции setuid() и seteuid(). Аналогичные функции для переустановки идентификаторов группы процесса называются setgid() и setegid().
Опрос и/или изменение маски режима создания файлов вызывающего процесса осуществляет служебная программа umask и одноименная функция.
Новые процессы создаются при помощи функции fork().
Обычно процесс-потомок, используя функцию семейства exec(), подменяет программу, которая определяет поведение процесса, и передает ей управление и список аргументов. К числу функций этого семейства принадлежат execl(), execv(), execle(), execve(), execlp(), execvp().
Родительский процесс реализует ожидание завершения процессов-потомков и получает информацию о статусе завершения от функций семейства wait() - wait() и waitpid().
Процесс может вызвать собственное завершение, обратившись к функциям семейства exit() - exit(), _Exit(), _exit().
Функция atexit() позволяет зарегистрировать функции, которые будут вызываться, если процесс завершается, обращаясь к exit() или возвращаясь из main().
Для терминирования процессов извне предназначена служебная программа kill.

http://localhost:3232/img/empty.gifhttp://localhost:3232/img/empty.gifСредства межпроцессного взаимодействия

Средства локального межпроцессного взаимодействия реализуют высокопроизводительную, детерминированную передачу данных между процессами в пределах одной системы.
К числу наиболее простых и в то же время самых употребительных средств межпроцессного взаимодействия принадлежат каналы, представляемые файлами соответствующего типа. Стандарт POSIX-2001 различает именованные и безымянные каналы.
Взаимодействие между процессами через канал может быть установлено следующим образом: один из процессов с помощью функций popen() или pipe() создает канал и передает другому соответствующий открытый файловый дескриптор. После этого процессы обмениваются данными через канал посредством функций read() и write().
По сравнению с pipe() функция popen() является более высокоуровневой. Она делает сразу несколько вещей: порождает процесс, обеспечивает выполнение заданной команды в его рамках, организует канал между вызывающим и порожденным процессами и формирует необходимые потоки для этого канала.
Канал остается открытым до тех пор, пока не будет вызвана функция pclose().
Согласно стандарту POSIX-2001, под сигналом понимается механизм, с помощью которого процесс или поток управления уведомляют о некотором событии, произошедшем в системе, или подвергаются воздействию этого события.
В каждом процессе определены действия, предпринимаемые в ответ на все предусмотренные системой сигналы.
У каждого потока управления есть маска сигналов, определяющая набор блокируемых сигналов.
С сигналом могут быть ассоциированы действия одного из трех типов.
SIG_DFL
Подразумеваемые действия, зависящие от сигнала. Они описаны в заголовочном файле <signal.h>.
SIG_IGN
Игнорировать сигнал. Доставка сигнала не оказывает воздействия на процесс .
Указатель на функцию
Обработать сигнал, выполнив при его доставке заданную функцию. После завершения функции обработки процесс возобновляет выполнение с точки прерывания.
К средствам генерации сигналов относятся служебная программа и одноименная функция.
Процесс (поток управления) может послать сигнал самому себе с помощью функции raise().
Функция abort() вызывает аварийное завершение процесса.
Опросить и изменить способ обработки сигналов позволяет функция sigaction().
Опросить и изменить способ обработки сигналов можно и на уровне командного интерпретатора, посредством специальной встроенной команды trap.
К техническим аспектам можно отнести работу с наборами сигналов. Ее выполняют инициализирующие набор функции sigemptyset() и sigfillset(), добавляющая сигнал signo к набору set функция sigaddset(),удаляющая сигнал функция sigdelset() и проверяющая вхождение в набор функция sigismember().
Функция sigprocmask() предназначена для опроса и/или изменения маски сигналов процесса, определяющей набор блокируемых сигналов.
Функция sigpending() позволяет выяснить набор блокированных сигналов, ожидающих доставки вызывающему процессу (потоку управления). Дождаться появления подобного сигнала можно с помощью функции sigwait().
Функция pause() поможет дождаться доставки обрабатываемого или терминирующего процесс сигнала.
Функция sigsuspend() заменяет текущую маску сигналов вызывающего процесса, а затем переходит в состояние ожидания. Обычно парой функций sigprocmask() и sigsuspend() обрамляют критические интервалы.
Очереди сообщений, семафоры и разделяемые сегменты памяти отнесены к необязательной части стандарта POSIX-2001, именуемой "X/Open-расширение системного интерфейса"(XSI).
Каждую очередь сообщений, набор семафоров и разделяемый сегмент однозначно идентифицирует положительное целое число, которое возвращается в качестве результатов функций msgget(), semget() и shmget().
При получении идентификаторов средств межпроцессного взаимодействия используется еще одна сущность - ключ, для его генерации предназначена функция ftok().
Опросить статус присутствующих в данный момент в системе (активных) средств межпроцессного взаимодействия позволяет служебная программа ipcs.
Для удаления из системы активных средств межпроцессного взаимодействия предназначена служебная программа ipcrm.
Механизм очередей сообщений позволяет процессам взаимодействовать, обмениваясь данными, которые передаются между процессами дискретными порциями, называемыми сообщениями. процессы выполняют над сообщениями две основные операции - прием и отправку.
Для работы с очередями сообщений в стандарте POSIX-2001 предусмотрены следующие функции: msgget() - получение идентификатора очереди сообщений, msgctl() - управление очередью сообщений, msgsnd() - отправка сообщения, msgrcv() - прием сообщения.
Согласно определению стандарта POSIX-2001, семафор - это минимальный примитив синхронизации, служащий основой для более сложных механизмов синхронизации, определенных в прикладной программе.
У семафора есть значение, которое представляется целым числом в диапазоне от 0 до 32767.
Семафоры создаются функцией semget() и обрабатываются функцией semop() определенными наборами (массивами), причем операции над наборами с точки зрения приложений являются атомарными. В рамках групповых операций для любого семафора из набора можно сделать следующее: увеличить значение, уменьшить значение, дождаться обнуления.
Процессы, обладающие соответствующими правами, могут выполнять также различные управляющие действия над семафорами. Для этого служит функция semctl().
В стандарте POSIX-2001 разделяемый объект памяти определяется как объект, представляющий собой память, которая может быть параллельно отображена в адресное пространство более чем одного процесса.
Работа с разделяемой памятью начинается с того, что один из взаимодействующих процессов посредством функции shmget() создает разделяемый сегмент, специфицируя первоначальные права доступа к нему и его размер в байтах.
Для получения доступа к разделяемому сегменту его нужно присоединить посредством функции shmat(), т.е. Разместить сегмент в виртуальном пространстве процесса. После присоединения, в соответствии с правами доступа, процессы могут читать данные из сегмента и записывать их (быть может, синхронизируя свои действия с помощью семафоров). Когда разделяемый сегмент становится ненужным, его следует отсоединить с помощью функции shmdt().
Предусмотрена возможность выполнения управляющих действий над разделяемыми сегментами (функция shmctl()).

http://localhost:3232/img/empty.gifhttp://localhost:3232/img/empty.gifОбщий терминальный интерфейс

В стандарте POSIX-2001 терминал или терминальное устройство определяется как символьный специальный файл , удовлетворяющий спецификациям общего терминального интерфейса.
С каждым терминальным устройством ассоциированы очереди ввода и вывода.
Ввод может происходить в каноническом и неканоническом режимах. Канонический режим означает построчную буферизацию ввода системой, а также естественную обработку символов забоя и уничтожения строки.
В неканоническом режиме входные данные не подвергаются препроцессированию системой, а обработка запроса на чтение зависит от двух параметров - min и time.
Некоторые символы играют специальную роль при вводе и/или выводе. Например, символ intr генерирует сигнал прерывания (sigint), посылаемый всем процессам, для которых данный терминал является управляющим.
Служебная программа tty выдает на стандартный вывод имя терминала, открытого в качестве стандартного ввода.
Узнать, ассоциирован ли открытый файловый дескриптор с терминальным устройством, а также получить имя этого устройства можно с помощью функций isatty() и ttyname().
Каждый терминал обладает рядом характеристик, которые можно опросить и/или изменить, используя утилиту stty.
Некоторые, хотя и весьма ограниченные, возможности управления терминалами предоставляет служебная программа tput.
На уровне функций опрос и изменение характеристик терминала разбиты на два семейства: tc*() и cf*(). В первое входят функции tcgetattr() - опрос, tcsetattr() - изменение, tcflow() - приостановка или возобновление терминального ввода/вывода, tcflush() - сброс очереди ввода, tcdrain() - ожидание физического окончания вывода, tcsendbreak() - разрыв соединения, tcgetpgrp() - получение идентификатора ассоциированной с терминалом группы процессов переднего плана, tcsetpgrp() - установка идентификатора группы, tcgetsid() - опрос идентификатора группы процессов лидера сеанса, для которого терминал является управляющим.
Функции семейства cf*() - cfgetispeed(), cfgetospeed(), cfsetispeed(), cfsetospeed() - служат для выборки/изменения данных о скорости терминального ввода/вывода.
Для получения маршрутного имени управляющего терминала служит функция ctermid().
Опрос характеристик хостов
Самую общую информацию о характеристиках хоста позволяют получить служебная программа uname и одноименная функция.
Функция gethostname() возвращает имя хоста.
Значения конфигурационных параметров - важнейшая характеристика хоста, а настройка на конфигурацию целевой системы - обязательный элемент мобильного программирования приложений.
Основная часть статической конфигурационной информации сосредоточена в заголовочном файле <unistd.h>. К числу наиболее важных характеристик принадлежат _POSIX_VERSION (поддерживаемая версия системного интерфейса для языка c стандарта POSIX) и _POSIX2_VERSION (поддерживаемая версия интерфейса к системным сервисам на уровне командного языка и служебных программ).
Отдельная группа констант описывает поддерживаемые необязательные возможности стандарта POSIX-2001. Среди них _POSIX_IPV6 (реализация поддерживает IPv6), _POSIX_REGEXP (реализация поддерживает обработку регулярных выражений), _POSIX_SHELL (реализация поддерживает стандартный командный интерпретатор), _POSIX_V6_ILP32_OFF32 (реализация предоставляет среду компиляции C-программ с 32-битными типами int, long, off_t и такими же указателями) и т.д.
Три константы задают номера файловых дескрипторов для стандартных ввода (STDIN_FILENO со значением 0), вывода (STDOUT_FILENO - 1) и протокола (STDERR_FILENO - 2).
Разного рода лимиты на количество и размеры заданы в заголовочном файле <limits.h>. Стандарт определяет минимально допустимые значения для подобных лимитов, которые должны поддерживаться реализациями и предоставляться приложениям.
Мобильным приложениям не следует полагаться на какие-то конкретные значения лимитов и требовать больше ресурсов, чем предусмотрено минимально допустимыми значениями.
Для опроса значений системных параметров во время выполнения предназначены служебная программа getconf, а также функции sysconf(), confstr(), fpathconf() и pathconf(), первая из которых опрашивает лимитирующие конфигурационные параметры, имеющие числовые значения, вторая возвращает конфигурационные цепочки символов, а две последние - конфигурационные значения, относящиеся к файлам.

http://localhost:3232/img/empty.gifСетевые средства

Стандарт POSIX-2001 определяет сеть как совокупность взаимосвязанных хостов. Под сетевым адресом понимается видимый в пределах сети идентификатор, используемый для обозначения оконечных точек сети.
Процесс присвоения сетевого адреса оконечной точке называется связыванием, или привязкой, а обратное действие - освобождением , или отменой привязки.
Обычно оконечной точкой служит аппаратный сетевой интерфейс, посредством которого данные передаются и принимаются, однако с таким интерфейсом, как шлейфовый (loopback), никакой аппаратуры не ассоциировано.
Данные передаются по сети в виде последовательности октетов (восьмибитных беззнаковых величин). Если некоторый элемент данных (например, адрес или номер порта) состоит более чем из восьми бит, для его передачи и хранения требуется несколько октетов. Сетевым называется порядок октетов (байт), при котором первый (с наименьшим адресом) октет содержит старшие (наиболее значимые) биты.
При взаимодействии процессов оконечными точками служат сокеты, стандарт POSIX-2001 трактует их как отдельный тип файлов.
Под адресом сокета как (удаленной) оконечной точки понимается структура, включающая идентификатор адресного семейства и специфичную для данного семейства адресную информацию.
Адресное семейство соответствует определенной среде взаимодействия. Стандарт POSIX-2001 определяет три таких семейства: AF_UNIX (межпроцессное взаимодействие в пределах одной системы), AF_INET (взаимодействие по протоколам IPv4), AF_INET6 (взаимодействие по протоколам IPv6 - необязательная возможность).
В пределах каждого адресного семейства могут существовать сокеты нескольких типов. Стандартом POSIX-2001 предусмотрено четыре типа: SOCK_STREAM (надежные, упорядоченные, полнодуплексные потоки октетов в режиме с установлением соединения), SOCK_SEQPACKET (аналог SOCK_STREAM с дополнительным сохранением границ между записями), SOCK_DGRAM (передача данных в виде датаграмм в режиме без установления соединения), SOCK_RAW (аналог SOCK_DGRAM с дополнительной возможностью доступа к протокольным заголовкам и другой информации нижнего уровня - необязательная возможность).
Для каждого адресного семейства каждый тип сокета может поддерживаться одним или несколькими протоколами. В частности, в адресном семействе AF_INET для сокетов типа SOCK_STREAM подразумеваемым является протокол с именем IPPROTO_TCP, а для типа SOCK_DGRAM - IPPROTO_UDP.

 

 
На главную | Содержание | < Назад....Вперёд >
С вопросами и предложениями можно обращаться по nicivas@bk.ru. 2013 г.Яндекс.Метрика