Повышение мобильности прикладного программного обеспечения (ПО) - задача исключительной важности и сложности, решение которой является необходимым условием сокращения сроков реализации аппаратно-программных систем, снижения затрат на реализацию, повышения качества систем. Для приложений реального времени и программного обеспечения встроенных систем она важна и сложна вдвойне. Важность проистекает из многочисленности подобных систем и ответственности решаемых ими задач. Сложность является следствием разнообразия (разнородности) и частой смены (модернизации) аппаратных платформ, а также того обстоятельства, что в понятие семантической корректности входит дополнительный компонент - соблюдение временных ограничений.
Один из общепринятых способов повышения мобильности ПО - стандартизация окружения приложений: предоставляемых программных интерфейсов, утилит и т.п. На уровне системных сервисов подобное окружение описывается стандартами POSIX.1 1 - 4, 10 - 13 или POSIX.5 14, на уровне языка программирования - стандартом конкретного языка, например, языков Си или Ада .
К сожалению, в силу широты спектра и существенно разных масштабов систем реального времени и встроенных систем, соответствие даже обязательному ядру (и, тем более, полному варианту) стандарта POSIX.1 в общем случае невозможно. Ограничения, налагаемые аппаратными платформами, заставляют минимизировать как объем ресурсов, используемых операционной системой (ОС) и приложениями, так и набор предоставляемых и применяемых системных сервисов. Например, если отсутствует
Следовательно, для систем реального времени и встроенных систем требуется подход к стандартизации, учитывающий перечисленные выше особенности.
Напомним некоторые понятия, ассоциированные со стандартом POSIX.1.
Важнейшим является понятие соответствия стандарту POSIX.1. Подобно тому, как у всякого интерфейса есть две стороны: вызывающая и вызываемая, две стороны есть и у POSIX-соответствия:
Реализация (операционная система), соответствующая стандарту POSIX.1, должна поддерживать все обязательные служебные программы, функции, заголовочные файлы с обеспечением специфицированного в стандарте поведения.
ОС может предоставлять возможности, помеченные в стандарте как дополнительные, а также нестандартные возможности. Если утверждается, что поддерживается некоторое расширение, это должно производиться непротиворечивым образом, для всех необходимых частей, так, как описано в стандарте.
В документации на ОС должны быть отражены вопросы соответствия стандарту POSIX.1, описаны поддерживаемые дополнительные и нестандартные возможности.
Для приложений понятие соответствия стандарту POSIX.1 богаче нюансами. Предусмотрено строгое соответствие, главный отличительный признак которого - ограничение круга используемых возможностей рамками стандарта. Рассматривается и
(Отметим в скобках, что для реализации понятие строгого POSIX-соответствия бессмысленно хотя бы по той причине, что не бывает операционных систем без средств администрирования, а они не описываются данным стандартом.)
Профилем будем называть набор опций, описывающих необязательные возможности стандарта POSIX.1. Соответствие профилю означает соответствие стандарту и поддержку заданных возможностей. Разумным образом выбранные профили позволяют учитывать потребности представительных классов пользователей и/или приложений.
Допускается существование
В настоящей работе рассматривается наиболее свежая из доступных редакций стандарта POSIX.13, принятая в 2003 году и опубликованная 10 сентября 2004 года. Эта редакция существенно отличается от предыдущей (1998 года) хотя бы по той причине, что за прошедшие годы базовый стандарт POSIX.1 был значительно расширен (см. [13, 14]) и в настоящее время содержит достаточно возможностей, чтобы сделать разработку и реализацию соответствующих ему операционных систем и приложений реального времени делом технически и экономически оправданным.
Чтобы показать место стандарта POSIX.13-2003 в общей иерархии профилей открытых систем, приведем еще несколько определений.
В рассматриваемом контексте стандартизации, профилем называется совокупность базовых стандартов с выбранными из них подмножествами, опциями и параметрами, служащая для достижения заранее определенных целей.
Под окружением открытой системы понимается единый, исчерпывающий набор интерфейсов, сервисов, форматов для обеспечения взаимной совместимости и мобильности приложений, данных и пользователей.
Профиль окружения приложения - это профиль, специфицирующий полное и согласованное подмножество окружения открытой системы.
Платформа приложения - это совокупность ресурсов, обеспечивающих работу приложения.
Под системным профилем понимается профиль окружения приложения, специфицирующий множество функций, необходимых для поддержки определенного класса приложений. Он регламентирует наблюдаемое поведение на интерфейсах приложения и платформы.
Общий профиль окружения приложения - это профиль окружения приложения, не ограниченный рамками определенного класса приложений или сообщества пользователей.
Профилем окружения реального времени называется профиль, предназначенный для поддержки приложений с ограничениями на время реакции.
В иерархии стандартизованных профилей на верхнем уровне находятся профили окружения открытых систем (при их именовании используется префикс P), на следующем - профили окружения приложений (Application Environment Profiles, AEP), ниже - системные профили (префикс PS), еще ниже - общие профили окружения (префикс
В стандарте POSIX.13-2003 определены следующие четыре профиля:
Перечисленные классы систем и профили для них будут детально рассмотрены далее.
Под встроенной компьютерной системой в стандарте POSIX.13-2003 понимается совокупность аппаратного и программного обеспечения, являющаяся неотъемлемой частью более крупной системы и используемая для управления и/или непосредственного мониторинга этой системы с применением специальных аппаратных устройств.
Отметим широту приведенного определения. Ему удовлетворяют как внутренние микропроцессоры сотовых телефонов или дисковых приводов, так и мощные компьютеры, занимающие огромные залы и управляющие большими
Для нужд профилей, стандартизуемых спецификациями POSIX.13-2003, необходима более тонкая
В силу специфики систем реального времени и встроенных систем инструментальная платформа и платформа выполнения (называемая также
Для языка Си выделены следующие единицы функциональности:
POSIX_C_LANG_JUMP. В эту единицу входят лишь две функции - longjmp() и setjmp().POSIX_C_LANG_MATH - математическая библиотека, от acos () до truncl().POSIX_C_LANG_SUPPORT - стандартная библиотека языка Си: функции abs(), asctime(), malloc(), memcpy(), strcpy(), va_start(), vsscanf() и др.POSIX_C_LANG_WIDE_CHAR - работа с широкими символами: btowc(), iswalnum(), mblen(), towlower(), wcscpy(), wmemset().POSIX_DEVICE_IO - clearerr(), close(), fclose(), fgets(), printf(), write().POSIX_DEVICE_SPECIFIC - cfgetispeed(), tcflow(), ttyname().POSIX_EVENT_MGMT - FD_CLR(), select().POSIX_FD_MGMT - dup, fcntl(), rewind ().POSIX_FIFO - mkfifo ().POSIX_FILE_ATTRIBUTES - chmod(), chown(), umask().POSIX_FILE_LOCKING - flockfile(), getc_unlocked().POSIX_FILE_SYSTEM - access(), chdir(), creat(), mkdir(), stat(), tmpfile(), utime().POSIX_FILE_SYSTEM_EXT - glob(), globfree().POSIX_JOB_CONTROL - setpgid(), tcgetpgrp(), tcsetpgrp().POSIX_MULTI_PROCESS - _Exit(), assert(), atexit(), clock(), execl (), fork(), getpid (), sleep(), wait(), waitpid().POSIX_NETWORKING - accept(), bind(), connect(), getaddrinfo(), gethostbyname(), getsockopt(), htonl(), inet_addr(), recv(), send(), socket().POSIX_PIPE - pipe().POSIX_REGEXP - regcomp(), regexec().POSIX_RW_LOCKS - pthread_rwlock_init(), pthread_rwlock_rdlock(), pthread_rwlockattr_init().POSIX_SHELL_FUNC - popen(), system(), wordexp().POSIX_SIGNALS - abort(), alarm (), kill(), sigaction(), sigwait().POSIX_SIGNAL_JUMP - siglongjmp(), sigsetjmp().POSIX_SINGLE_PROCESS - confstr(), environ, errno, getenv(), sysconf(), uname().POSIX_STRING_MATCHING - fnmatch(), getopt(), optopt.POSIX_SYMBOLIC_LINKS - lstat(), readlink(), symlink().POSIX_SYSTEM_DATABASE - getgrgid(), getpwnam(), getpwuid().POSIX_THREADS_BASE - pthread_atfork(), pthread_attr_init(), pthread_cleanup_pop(), pthread_cond_init(), pthread_create(), pthread_getspecific(), pthread_mutex_init(), pthread_mutex_lock(), pthread_once(), pthread_sigmask(), pthread_testcancel().POSIX_USER_GROUPS - getgid(), getlogin(), seteuid().POSIX_WIDE_CHAR_IO - fgetwc(), vfwprintf(), wscanf().XSI_C_LANG_SUPPORT - _tolower(), a64l(), drand48(), getcontext(), hcreate(), lfind(), memccpy(), strdup(), swab(), tfind(), timezone.XSI_DBM - dbm_open(), dbm_store().XSI_DEVICE_IO - poll (), pread(), writev().XSI_DEVICE_SPECIFIC - grantpt(), posix_openpt(), ptsname().XSI_DYNAMIC_LINKING - dlopen(), dlsym().XSI_FD_MGMT - truncate().XSI_FILE_SYSTEM - basename (), ftw (), lockf(), mknod(), realpath(), sync(), tempnam().XSI_I18N - catopen(), nl_langinfo().XSI_IPC - ftok(), msgget(), semget(), shmat().XSI_JOB_CONTROL - tcgetsid().XSI_JUMP - _longjmp(), _setjmp().XSI_MATH - j0(), yn().XSI_MULTI_PROCESS - getpriority(), getrusage(), nice(), ulimit(), waitid().XSI_SIGNALS - bsd_signal(), killpg(), sighold(), ualarm().XSI_SINGLE_PROCESS - gethostid(), gettimeofday(), putenv().XSI_SYSTEM_DATABASE - endpwent(), getpwent(), setpwent().XSI_SYSTEM_LOGGING - closelog(), openlog(), setlogmask(), syslog().XSI_THREAD_MUTEX_EXT - pthread_mutexattr_gettype(), pthread_mutexattr_settype().XSI_THREADS_EXT - pthread_attr_getguardsize(), pthread_attr_getstack(), pthread_attr_setconcurrency().XSI_TIMERS - getitimer(), setitimer().XSI_USER_GROUPS - getgrent(), getutxent(), pututxline().XSI_WIDE_CHAR - wcswidth(), wcwidth().Отметим, что единицы функциональности выделены в стандарте POSIX.13-2003 с запасом. В специфицированных профилях не фигурируют функции, обслуживающие POSIX_RW_LOCKS ), поскольку применение подобных блокировок может вызвать неограниченную XSI_DYNAMIC_LINKING, XSI_SYSTEM_LOGGING, XSI_THREAD_MUTEX_EXT, XSI_THREADS_EXT и функция mknod() из единицы XSI_FILE_SYSTEM ).
В приложении B стандарта POSIX.13-2003 приведены таблицы соответствия между опциями системных интерфейсов и служебных программ с одной стороны, и принадлежащими им функциями и утилитами с другой стороны. Мы не будем детально останавливаться на этом соответствии. Укажем лишь, что для стандартизованных профилей не требуются функциональные возможности, предоставляемые опциями _POSIX_BARRIERS (причина - вторичность барьеров как примитива синхронизации для однопроцессорных систем), _POSIX_IPV6 (IPv6 продолжает оставаться экзотикой), _POSIX_SPIN_LOCKS (_POSIX_TYPED_MEMORY_OBJECTS (_POSIX2_C_DEV, _POSIX2_CHAR_TERM, _POSIX2_FORT_RUN, _POSIX2_SW_DEV, _POSIX2_UPE для нужд инструментальной платформы.
Не всем опциям соответствуют функции или служебные программы. Иногда требуется наличие в реализации определенных объектов или особенностей поведения. Таковы, например, существенные в рассматриваемом контексте опции _POSIX_CHOWN_RESTRICTED, _POSIX_MONOTONIC_CLOCK, _POSIX_PRIORITIZED_IO, _POSIX_RAW_SOCKETS, _POSIX_SAVED_IDS, _POSIX_SPORADIC_SERVER, _POSIX_THREAD_SPORADIC_SERVER, _POSIX_VDISABLE.
Авторы стандарта POSIX.13-2003 основывали свою работу на опыте создания и использования ядер ОС реального времени, имеющих небольшие размеры и, как правило, не-Unix-происхождение, а также возрастающего числа POSIX-совместимых ядер с возможностями реального времени. Были рассмотрены такие коммерчески успешные продукты, как
Для современных систем реального времени и встроенных систем характерны следующие базовые свойства и возможности организации многозадачности и синхронизации:
open(), close, read(), write(), ioctl(), posix_devctl() );Применительно к вводу/выводу ОС реального времени обычно предоставляет следующие средства и возможности:
Поддержка локальных файловых систем (возможно, упрощенных, например, одноуровневых):
Сетевые коммуникации:
Поддержка удаленных файловых систем:
Защита памяти:
Поддержка
Поддержка процесса разработки приложений:
Таков спектр возможностей, из которых формируются рассматриваемые профили.
В стандарте POSIX.13-2003 выделено четыре вложенных класса систем реального времени и встроенных систем:
Как правило, минимальные системы реального времени являются встроенными в более крупные системы, предназначенные для автоматического управления специализированными устройствами. Для минимальных систем не предполагается существования ни
С программной точки зрения существует один (неявный) POSIX-процесс, все потоки управления которого функционируют в аппаратном адресном пространстве процессора. Если система содержит несколько процессоров, обычно на каждом из них запускается свой экземпляр операционной системы, а общение происходит через
Работа со специализированными устройствами строится либо с помощью базового
Управляющие системы реального времени отличаются от минимальных наличием файловой системы, которая может располагаться в оперативной или флэш-памяти. С программной точки зрения добавляются интерфейсы для поддержки файловой системы и асинхронного ввода/вывода.
Отличительная черта специализированных системы реального времени - поддержка многопроцессной модели выполнения на одном или нескольких процессорах, каждый из которых снабжен устройством управления памятью. Операционная система должна предоставлять средства удержания заданных частей адресного пространства в физической памяти.
Вообще говоря, подобные системы могут эксплуатировать в условиях, исключающих применение дисковых приводов, однако применение флэш-памяти позволяет организовать файловую систему, быть может, упрощенную.
Перечисленные три класса систем могут не содержать (и, как правило, не содержат) средств разработки, но, разумеется, для них предполагается существование инструментальной платформы, поддерживающей опцию _POSIX2_SW_DEV (и _POSIX2_C_DEV для среды разработки на языке Си).
Универсальные системы реального времени, согласно стандарту POSIX.13-2003, должны быть самодостаточными, снабженными высокоскоростными запоминающими устройствами, терминальными, сетевыми и специализированными интерфейсами. Такие системы должны поддерживать выполнение смеси задач, лишь часть из которых относится к классу задач реального времени.
Поскольку пользователи могут организовывать интерактивные сеансы с универсальными системами реального времени, должна обеспечиваться поддержка всех обязательных служебных программ, определенных в стандарте POSIX.1. Многозадачность может быть реализована на уровне потоков управления и/или процессов.
Профиль для минимальных систем реального времени в стандарте POSIX.13-2003 именуется PSE51. Имена, зарезервированные для этого профиля, начинаются с префикса _POSIX_AEP_REALTIME. Если реализация поддерживает этот профиль, в заголовочном файле <unistd.h> должно быть определено имя _POSIX_AEP_REALTIME_MINIMAL со значением 200312L. Если реализация выполнена на языке Си и поддерживает программную среду для этого языка, должно быть определено имя _POSIX_AEP_REALTIME_LANG_C99.
Реализация должна поддерживать следующие единицы функциональности: POSIX_C_LANG_JUMP, POSIX_C_LANG_SUPPORT, POSIX_DEVICE_IO, POSIX_FILE_LOCKING, POSIX_SIGNALS, POSIX_SINGLE_PROCESS, POSIX_THREADS_BASE, XSI_THREAD_MUTEX_EXT, XSI_THREADS_EXT.
В число поддерживаемых опций входят: _POSIX_CLOCK_SELECTION, _POSIX_FSYNC, _POSIX_MEMLOCK, _POSIX_MEMLOCK_RANGE, _POSIX_MONOTONIC_CLOCK, _POSIX_REALTIME_SIGNALS, _POSIX_SEMAPHORES, _POSIX_SHARED_MEMORY_OBJECTS, _POSIX_SYNCHRONIZED_IO, _POSIX_THREAD_ATTR_STACKADDR, _POSIX_THREAD_ATTR_STACKSIZE, _POSIX_THREAD_CPUTIME, _POSIX_THREAD_PRIO_INHERIT, _POSIX_THREAD_PRIO_PROTECT, _POSIX_THREAD_PRIORITY_SCHEDULING, _POSIX_THREAD_SPORADIC_SERVER, _POSIX_TIMEOUTS, _POSIX_TIMERS.
Значение TIMER_MAX должно быть не меньше 64, RTSIG_MAX - не менее 16.
Для SCHED_RR необходимо поддерживать по крайней мере 31 приоритет, не превосходящий максимальное значение приоритета для политики SCHED_FIFO.
Реализация, соответствующая профилю PSE51, должна предоставлять средства конфигурирования системы, так чтобы область планирования размещения имела единичный размер (иными словами, чтобы поддерживались однопроцессорные конфигурации), и чтобы привязка потоков управления к области планирования размещения (распределение по процессорам) оставалась статической.
Соответствие профилю PSE51 налагает некоторые ограничения и на приложения.
Приложение должно действовать так, как если бы значение CHILD_MAX было нулевым.
Сигналы не должны приводить к ненормальному завершению (единственного, неявного) процесса.
Нельзя вызывать функцию kill() с отрицательным аргументом, отличным от -1, поскольку группы процессов профилем PSE51 не поддерживаются.
Маска создания файлов должна равняться S_IRWXU ; иными словами, объект должен быть полностью доступен своему создателю.
Функции open(), fopen(), freopen() не должны использоваться для создания новых файлов, поскольку универсальная файловая система может и не существовать. Аналогично, аргументы, являющиеся именами файлов, не должны нести семантики файловой системы.
Не следует предполагать, что функции ввода/вывода изменяют времена, ассоциированные с файлами, поскольку профиль не содержит функций, позволяющих эти времена опросить.
Не следует вызывать функцию sysconf() с аргументом _POSIX_VERSION, поскольку результирующее значение не может быть осмысленным.
Профилем PSE51 предусмотрена поддержка инструментальной платформы, позволяющей готовить приложения для платформы выполнения, соответствующие рассматриваемому профилю. Для среды разработки на языке Си на инструментальной платформе должны поддерживаться опции _POSIX2_C_DEV и _POSIX2_SW_DEV.
Несколько моментов заслуживают отдельных пояснений. В минимальный профиль включены опции, обеспечивающие совместимость вверх без модификации исходных текстов приложений. К числу таких опций принадлежат, например, _POSIX_MEMLOCK и _POSIX_MEMLOCK_RANGE. Поскольку виртуальная память не поддерживается, приложение и так будет целиком располагаться в физической памяти, так что реализацию соответствующих функций можно сделать пустой, а их вызовы на минимальных системах ничему не помешают. Зато при переходе на более масштабные конфигурации удержание в физической памяти может оказаться не просто полезным, но необходимым.
На минимальных конфигурациях процессы не запускаются, но функция main() все же оказывается полезной для передачи данных из строки загрузки единственному (неявному) процессу и его потокам управления.
Сигналы реального времени обслуживают асинхронную модель обработки событий и исключительных ситуаций. По сравнению с базовым стандартом POSIX.1 их минимальное число увеличено вдвое - с 8 до 16.
Функция open() необходима даже при отсутствии файловой системы, поскольку она обслуживает обращения к устройствам и, в частности, их инициализацию. Средства блокировки файлов необходимы для обеспечения безопасной работы со стандартным вводом (объектами типа (FILE *) ) в многопотоковой среде.
Поддержка области планирования размещения единичного размера и статическая привязка к ней потоков управления помогает повысить детерминированность функционирования системы.
Поддержка монотонных часов гарантирует выполнение временных ограничений даже после перевода системных часов. Часы процессорного времени позволяют выявлять превышение допустимого времени счета, повышая тем самым надежность и предсказуемость поведения системы.
По сравнению с базовым стандартом POSIX.1 минимальное число таймеров увеличено вдвое, с 32 до 64, и сделано равным минимальному числу потоков управления, которое должна поддерживать реализация. В результате каждый поток может завести свой таймер, что нередко требуется в приложениях реального времени.
В редакции стандарта POSIX.13 от 1998 года поддержка очередей сообщений была обязательной для всех профилей. В новой редакции 2003 года для минимальных систем это требование опущено, поскольку необходимую функциональность могут предоставить мьютексы и переменные условия.
В минимальный профиль не включены средства трассировки и сетевые средства. Это позволяет уменьшить размер ОС и приложений.
В профиль PSE52 для управляющих систем реального времени, в дополнение к PSE51, включены следующие единицы функциональности: POSIX_C_LANG_MATH, POSIX_FD_MGMT, POSIX_FILE_SYSTEM.
Добавлены также опции _POSIX_MAPPED_FILES, _POSIX_MESSAGE_PASSING, _POSIX_TRACE, _POSIX_TRACE_EVENT_FILTER, _POSIX_TRACE_LOG.
Можно видеть, что, по сравнению с минимальным, в профиль для управляющих систем вошли четыре основные группы расширений.
Поддержка упрощенной файловой системы позволяет создавать и удалять файлы, но не включает такие единицы функциональности, как POSIX_FIFO, POSIX_FILE_ATTRIBUTES и POSIX_FILE_SYSTEM_EXT, а также опцию _POSIX_ADVISORY_INFO.
Средства передачи сообщений присутствуют в коммерческих продуктах рассматриваемого класса, поэтому они вошли в профиль PSE52.
Средства трассировки являются логическим дополнением к автоматическому режиму функционирования управляющих систем, помогая контролировать их работу.
Математическая библиотека также полезна для управляющих систем.
Профиль PSE53 для специализированных систем реального времени является расширением PSE52. В него дополнительно включены единицы функциональности POSIX_EVENT_MGMT, POSIX_MULTI_PROCESS, POSIX_NETWORKING, POSIX_PIPE, POSIX_SIGNAL_JUMP, а также опции _POSIX_ASYNCHRONOUS_IO, _POSIX_RAW_SOCKET, _POSIX_SPAWN, _POSIX_THREAD_PROCESS_SHARED.
Главное отличие профиля PSE53 от PSE52 - поддержка многопроцессных приложений (хотя и без групп процессов и с одним пользователем). Это потребовало включения средств управления файловыми дескрипторами, сделало желательным наличие асинхронного ввода/вывода.
Еще одно важнейшее расширение состоит в поддержке сетевых коммуникаций. При работе с сокетами обычно используется функция select() ; этим объясняется включение в профиль PSE53 единицы функциональности POSIX_EVENT_MGMT.
Универсальные системы реального времени должны быть самодостаточными. По этой причине в профиль PSE54 для универсальных систем вошли практически все единицы функциональности и опции базового стандарта POSIX.1.
Более точно, по сравнению с профилем PSE53 добавлены следующие единицы функциональности: POSIX_C_LANG_WIDE_CHAR, POSIX_DEVICE_SPECIFIC, POSIX_FIFO, POSIX_FILE_ATTRIBUTES, POSIX_FILE_SYSTEM_EXT, POSIX_JOB_CONTROL, POSIX_REGEXP, POSIX_SHELL_FUNC, POSIX_STRING_MATCHING, POSIX_SYMBOLIC_LINKS, POSIX_SYSTEM_DATABASE, POSIX_USER_GROUPS, POSIX_WIDE_CHAR_IO, XSI_DYNAMIC_LINKING, XSI_SYSTEM_LOGGING.
Добавлена поддержка следующих опций: _POSIX_ADVISORY_INFO, _POSIX_CHOWN_RESTRICTED, _POSIX_PRIORITIZED_IO, _POSIX_SAVED_IDS, _POSIX_THREAD_SAFE_FUNCTIONS, _POSIX_VDISABLE.
Отдельно упомянем добавленные в профиль PSE54 опции, описывающие служебные программы: _POSIX2_C_DEV, _POSIX2_CHAR_TERM, _POSIX2_FORT_RUN, _POSIX2_SW_DEV, _POSIX2_UPE.
В 2003 году был принят, а 9 сентября 2004 года опубликован стандарт на интерфейс управления устройствами POSIX.26-2003 [15]. Его можно назвать стандартом одной функции - posix_devctl(), являющейся улучшенным (более безопасным в плане контроля типов) вариантом известной функции ioctl(). Поддержка всех возможностей, предусмотренных стандартом POSIX.26, обязательна для всех рассмотренных выше профилей PSE51 - PSE54.
Функция posix_devctl() описывается следующим образом.
#include <devctl.h>
int posix_devctl (int fd, int dcmd, void *restrict dev_data_ptr, size_t nbyte,
int *restrict dev_info_ptr);
В случае нормального завершения результат функции равен нулю; в противном случае возвращается номер ошибки.
Аргумент fd - это файловый дескриптор, соответствующий устройству, dcmd - команда управления, dev_data_ptr - указатель на буфер для обмена данными между приложением и драйвером устройства, nbyte - размер буфера, dev_info_ptr - указатель на целочисленный объект, посредством которого драйвер может вернуть приложению дополнительную (по сравнению с результатом) информацию о статусе устройства.
Отметим одну тонкость. Если значение nbyte равно нулю, поведение функции posix_devctl() зависит от реализации. Это позволяет на исторически сложившихся платформах определить posix_devctl() через ioctl() как макрос, не внося изменения в драйверы.
Стандартизованные профили для поддержки систем реального времени и встроенных систем представляют собой важные опорные точки, характеризующие степень POSIX-соответствия операционных систем и приложений и, следовательно, степень их мобильности на уровне исходного языка. Даже если реализация или приложения не соответствуют ни одному из четырех рассмотренных профилей, можно выделить "наиболее подходящий" профиль и компактно описать предоставляемые или использованные расширения и оценить их влияние на мобильность приложений.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.