Вопрос или проблема
Я часто вижу упоминание POSIX повсюду, и я предполагал, что это базовый стандарт UNIX… пока не наткнулся на следующий отрывок на странице Википедии: The Open Group
The Open Group наиболее известна как
сертификационный орган для товарного знака UNIX
и публикация
Технического стандарта Единой UNIX Спецификации,
который расширяет
стандарты POSIX и является
официальным определением UNIX системы.
Если официальное определение UNIX системы является расширением POSIX, тогда что именно такое POSIX? …, Похоже, что это некий эталон мира UNIX, но я не знаю, как это вписывается в общую картину.
POSIX был стандартом с 1988 года, намного раньше Единой UNIX Спецификации. Это была одна из попыток унификации всех различных веток UNIX и UNIX-подобных систем. POSIX является стандартом IEEE, но поскольку IEEE не владеет товарным знаком UNIX®, стандарт не является UNIX®, хотя и основан на существующем API UNIX на тот момент. Первый стандарт POSIX.1 формально известен как IEEE std 1003.1-1988.[1] IEEE взимал значительную плату за получение копии стандарта.
The Open Group выпустила Единую UNIX Спецификацию (SUSv2) в 1997 году на основе работы IEEE по стандарту POSIX. SUSv3 была выпущена в 2001 году совместной рабочей группой между IEEE и The Open Group, известной как Austin Group. SUSv3 также известна как POSIX:2001[2]. В настоящее время существуют также POSIX:2004 и POSIX:2008, которые составляют основу SUSv4. Что касается того, что такое UNIX®, то UNIX® – это всё, что говорит текущий зарегистрированный владелец товарного знака об этом. С 1994 года это The Open Group.
Novell приобрела бизнес UNIX® систем у AT&T/USL, где и был рожден UNIX®. В 1994 году они продали право на товарный знак UNIX® компании X/Open[3], теперь известной как The Open Group. Затем они продали исходный код UNIX® компании SCO как UNIXWARE®.[3] Сам UNIX® неоднократно разделялся на различные ветви[4][5], отчасти из-за лицензирования AT&T. Покупка UNIX® давала вам полный исходный код операционной системы и весь инструментарий для его сборки. Модификации исходного кода могли быть распространены и использованы любым, кто обладал лицензией на UNIX® от AT&T. Лицензионный сбор составлял тысячи долларов.
BSD был проектом в Беркли, который добавил ряд улучшений к операционной системе UNIX®. Код BSD был выпущен под гораздо более либеральной лицензией, чем исходный код AT&T, и не требовал лицензии или даже необходимости распространяться с исходным кодом, в отличие от GPL, которую использует проект GNU и Linux. Это привело к тому, что значительная часть кода BSD была включена в различные коммерческие ветки UNIX. К примерно 4.3BSD они почти полностью заменили необходимость в оригинальном исходном коде AT&T UNIX®. FreeBSD/NetBSD/OpenBSD – это все ветки 4.3BSD, которые представляют собой полную операционную систему и не содержат оригинального исходного кода AT&T. Они также не имеют права на товарный знак UNIX®, но значительная часть их кода используется коммерческими операционными системами UNIX. API сокетов, используемый в UNIX, был разработан на BSD, а код Unix Fast Filesystem был заимствован и использован в различных операционных системах UNIX, таких как Solaris, с собственными улучшениями.
Linux был разработан в 1991 году, но был создан с нуля, в отличие от BSD, и использует существующий проект GNU, который является чисто интегрированной реализацией большей части пользовательского пространства UNIX. Он реализует большую часть POSIX для совместимости и по дизайну похож на UNIX, но не имеет тесной связи с AT&T или UNIX®, как у BSD.
Наиболее важные вещи, которые определяет POSIX 7
-
Значительно расширяет ANSI C такими вещами, как:
- множество операций с файлами:
mkdir
,dirname
,symlink
,readlink
,link
(жесткие ссылки),poll()
,stat
,sync
,nftw()
- процессы и потоки:
fork
,execl
,wait
,pipe
, семафорыsem_*
, общая память (shm_*
),kill
, параметры планирования (nice
,sched_*
),sleep
,mkfifo
,setpgid()
- сеть:
socket()
- управление памятью:
mmap
,mlock
,mprotect
,madvise
,brk()
- утилиты: регулярные выражения (
reg*
)
Эти API также определяют основные системные концепции, от которых они зависят, например,
fork
требует концепции процесса.Многие системные вызовы Linux существуют для реализации конкретной функции POSIX C API и делают Linux совместимым, например,
sys_write
,sys_read
, … Многие из этих системных вызовов также имеют специфичные для Linux расширения.Основная реализация для рабочих столов Linux: glibc, которая во многих случаях просто предоставляет поверхностную оболочку для системных вызовов.
- множество операций с файлами:
-
Например:
cd
,ls
,echo
, …Многие утилиты являются прямыми оболочками для соответствующей функции C API, например,
mkdir
.Основная реализация для рабочих столов Linux: GNU Coreutils для маленьких утилит, отдельные проекты GNU для больших:
sed
,grep
,awk
, … Некоторые CLI утилиты реализованы в Bash как встроенные. -
Например:
a=b; echo "$a"
Основная реализация для рабочих столов Linux: GNU Bash.
-
Например:
HOME
,PATH
.PATH
определяет семантику поиска, включая как слэши предотвращают поиск вPATH
. -
ANSI C гласит, что
0
илиEXIT_SUCCESS
означает успех,EXIT_FAILURE
– неудачу, и оставляет остальное на усмотрение реализации.POSIX добавляет:
-
126
: команда найдена, но не является исполняемой. -
127
: команда не найдена. -
> 128
: завершена сигналом.Но, похоже, POSIX не определяет правило
128 + SIGNAL_ID
, используемое Bash: Какой код завершения по умолчанию, когда процесс завершается?
Смотрите также: Что означает
$?
(знак доллара с вопросом) в скриптах оболочки? -
-
Существует два типа: BRE (Основное) и ERE (Расширенное). Основное устарело и сохраняется только для того, чтобы не сломать API.
Они реализованы с помощью функций C API и используются во всех CLI утилитах, например,
grep
принимает BRE по умолчанию, а ERE с-E
.Например:
echo 'a.1' | grep -E 'a.[[:digit:]]'
Основная реализация Linux: glibc реализует функции в regex.h, которые такие программы, как
grep
, могут использовать в качестве серверной части. -
Например:
/dev/null
,/tmp
Стандарт FHS значительно расширяет POSIX.
-
/
является разделителем путиNUL
нельзя использовать.
– этоcwd
,..
– родительский- портативные имена файлов
- используйте максимум 14 символов и 256 для полного пути
- могут содержать только:
a-zA-Z0-9._-
Смотрите также: https://stackoverflow.com/questions/18550253/what-is-posix-compliance-for-filesystem
-
Конвенции API командной строки
Необязательные, используются POSIX, но почти нигде больше, особенно не в GNU. Но действительно, это слишком ограничительные, например, только однобуквенные флаги (например,
-a
), без двойных дефисов для длинных версий (например,--all
).Некоторые широко используемые конвенции:
-
означает stdin, где ожидается файл--
завершает флаги, например,ls -- -l
, чтобы перечислить директорию с именем-l
Смотрите также: https://stackoverflow.com/questions/8957222/are-there-standards-for-linux-command-line-switches-and-arguments
-
“POSIX ACL” (Списки управления доступом), например, как используется в качестве бэкенда для
setfacl
.Этот проект был снят, но он был реализован в ряде ОС, включая Linux с
setxattr
.
Кто соответствует POSIX?
Многие системы строго следуют стандарту POSIX, но немногие из них сертифицированы The Open Group, которая поддерживает стандарт. Замечательные сертифицированные системы включают:
- OS X (Apple) X означает как 10, так и UNIX. Это была первая система Apple, соответствующая POSIX, выпущенная около 2001 года. Смотрите также: https://stackoverflow.com/questions/5785516/is-osx-a-posix-os
- AIX (IBM)
- HP-UX (HP)
- Solaris (Oracle)
Большинство дистрибутивов Linux очень совместимы, но не сертифицированы, потому что не хотят платить за проверку совместимости. K-UX от Inspur и EulerOS от Huawei являются двумя сертифицированными примерами.
Официальный список сертифицированных систем можно найти по адресу: https://www.opengroup.org/openbrand/register/ и также на странице вики.
Windows
Windows реализовал POSIX в некоторых своих профессиональных дистрибутивах.
Поскольку это была опциональная функция, программисты не могли полагаться на неё для большинства приложений конечного пользователя.
Поддержка была снята в Windows 8:
- https://stackoverflow.com/questions/4746043/where-does-microsoft-windows-7-posix-implementation-currently-stand
- https://superuser.com/questions/495360/does-windows-8-still-implement-posix
- Запрос функции: https://windows.uservoice.com/forums/265757-windows-feature-suggestions/suggestions/6573649-full-posix-support
В 2016 году была анонсирована новая официальная API, похожая на Linux, называемая “Подсистема Windows для Linux”. Она включает системные вызовы Linux, выполнение ELF, части файловой системы /proc
, Bash, GCC, (вероятно, glibc?), apt-get
и многое другое: https://channel9.msdn.com/Events/Build/2016/P488, поэтому я считаю, что это позволит Windows запускать большую часть, если не весь, POSIX. Тем не менее, это ориентировано на разработчиков/развертывание, а не на конечных пользователей. В частности, не было планов предоставлять доступ к графическому интерфейсу Windows.
Исторический обзор официальной совместимости Microsoft с POSIX: http://brianreiter.org/2010/08/24/the-sad-history-of-the-microsoft-posix-subsystem/
Cygwin – это известный GPL проект третьей стороны, который “предоставляет значительную функциональность API POSIX” для Windows, но требует, чтобы вы “пересобрали свое приложение из исходного кода, если хотите, чтобы оно работало на Windows”. MSYS2 – это связанный проект, который, похоже, добавляет больше функциональности поверх Cygwin.
Android
Android имеет свою собственную библиотеку C (Bionic), которая не полностью поддерживает POSIX на Android O: https://stackoverflow.com/questions/27604455/is-android-posix-compatible
Бонусный уровень
Linux Standard Base дополнительно расширяет POSIX.
Используйте индексы без рамок, они гораздо более читаемы и удобны для поиска: http://pubs.opengroup.org/onlinepubs/9699919799/nfindex.html
Получите полную сжатую версию HTML страниц для поиска: https://stackoverflow.com/questions/453993/is-there-a-listing-of-the-posix-api-functions/45832939#45832939
POSIX – это стандарт переносимого операционной системы. Он описывает определенные утилиты, API и сервисы, которые соответствующая операционная система должна предоставлять программному обеспечению (например, сокеты, ввод-вывод файлов и потоки), наряду с конвенциями о том, как эти функции должны вызываться из программы.
Идея заключается в том, что программа, написанная для одной ОС, совместимой с POSIX, будет легче перенести на другую ОС, совместимую с POSIX, чем переносить между не совместимыми с POSIX ОС. Именно поэтому значительно легче перенести приложение, скажем, с FreeBSD на Linux, чем с FreeBSD на Windows (хотя Windows, по сути, поддерживает подсет POSIX).
POSIX является подмножеством UNIX, предназначенным для охвата различных UNIX-подобных сред для других операционных систем; это первоначально включало такие среды, как Eunice для VMS, POSIX-персонажи Windows NT и Apollo Domain/OS. Вы можете рассматривать это как стандартный API для переносимости для подмножества сервисов операционной системы, поведение которых общие между Unix и не-Unix. Смотрите http://standards.ieee.org/develop/wg/POSIX.html для получения дополнительной информации.
Вопрос, заданный в этом разделе вопросов и ответов…
“Что именно такое POSIX?”
Многие ответы на поставленный вопрос излишне многословны. Большинство из них содержат неуместные, неверные и/или устаревшие сведения. В защиту авторов предыдущих ответов, они были написаны в другое время, когда и POSIX, и Сеть Stack Exchange были значительно другими менее чем десятилетие назад. Более того, стандарты, которые раньше составляли определение того, что такое POSIX, теперь объединены в один стандарт, который был завершён почти до состояния совершенства (или, по крайней мере, по сравнению с тем, каким стандарт был раньше).
- Текущий стандарт: POSIX.1-2024
POSIX можно рассматривать как 2 Компонента UNIX ОС
…окружение и интерфейс, однако они реализованы таким образом, что окружение и интерфейс являются неотрывными. Я никогда не работал на более низком уровне любой ОС, кроме Linux, однако, я предположил бы, что это распространено в большинстве операционных систем.
- Окружение- Интерфейс системы в значительной степени определяет окружение, в котором выполняется код, а значит, и где работают приложения/программное обеспечение. Согласно определяющему параграфу POSIX.1-2024:
“Общие термины, концепции и интерфейсы, общие для всех томов этого стандарта, включая конвенции утилит и определения заголовков языка C, включены в том Основных Определений. Определения системных сервисов и подпрограмм, системных сервисов, специфичных для языка, для языка программирования C, проблем функций, включая переносимость, обработку ошибок и восстановление после ошибок, включены в том Системных Интерфейсов.”
В двух словах, окружение POSIX определяется подпрограммами и встроенными функциями. Также включает в себя мониторинг и обработку ошибок. Оно также включает в себя язык C (заголовки, стандарт и компилятор), включает функциональность для подсистем и функций ОС,
- ИНТЕРФЕЙС В сущности, SHELL является системным интерфейсом, который работает на том же уровне, на котором работает написанный вами код. Работа на том же уровне, что и читаемый человеком код, делает оболочку такой мощной, и именно так POSIX позволяет своим пользователям выполнять интерпретируемый код, двоичные файлы и языки сценариев оболочки, написанные непосредственно в командной строке. Командная строка, работающая на уровне кода, вероятно, является самым высоким уровнем абстракции, который реализует POSIX.
Ответ или решение
Что такое POSIX?
POSIX (Portable Operating System Interface) — это стандарт, разработанный для обеспечения совместимости программного обеспечения между различными операционными системами. Главная цель POSIX заключается в том, чтобы позволить программам, написанным для одной совместимой ОС, быть более легкими для переноса на другую совместимую ОС. Это делает процесс разработки и поддержки программного обеспечения более эффективным и уменьшает затраты на адаптацию к различным системам.
POSIX был первоначально разработан в 1988 году как ответ на необходимость унификации различных версий UNIX и UNIX-подобных операционных систем. Он стал стандартом IEEE (Institute of Electrical and Electronics Engineers), но не является trademark’ом UNIX, поскольку право на использование этого названия принадлежит The Open Group.
Стандарт POSIX охватывает следующие ключевые аспекты:
-
API (интерфейс программирования приложений) – Включает функции для работы с файлами, потоками, процессами, сигналами и другими основными компонентами системного программирования на языках, таких как C. Например, такие функции, как
fork
иexec
, определяют, как создавать и управлять процессами. -
Утилиты командной строки – POSIX стандартизирует множество стандартных утилит, таких как
ls
,cp
,mkdir
, которые должны быть доступны в совместимых системах. Эти утилиты обеспечивают единообразный интерфейс командной строки. -
Конвенции окружения – Стандарт POSIX определяет различные переменные окружения, обязательные для правильной работы команд и программ, такие как
PATH
, которая указывает, где искать исполняемые файлы. -
Интерфейсы оболочки – Использование оболочек, таких как Bash, также стандартизировано, что позволяет пользователям взаимодействовать с операционной системой через командную строку, выполняя команды и скрипты непосредственно на уровне операционной системы.
Так как POSIX со временем развивался, появились и его расширения, такие как Single UNIX Specification (SUS), который включает в себя POSIX и добавляет дополнительные требования и улучшения, касающиеся сред UNIX. SUS обеспечивает более широкую основу для определения того, что именно является UNIX-системой.
Согласно современным стандартам, таким как POSIX.1-2024, определены такого рода концепции, которые обеспечивают необходимую терминологию и интерфейсы для системных вызовов и библиотек, необходимые для разработки совместимых приложений.
Кому нужен POSIX и кто его использует?
POSIX используется множеством операционных систем, включая различные дистрибутивы Linux,macOS, AIX (IBM), HP-UX (HP), Solaris (Oracle) и другие. Многие из этих систем продолжают следовать стандарту POSIX, хотя сертификация может быть дорогой и не всегда необходимой.
Несмотря на то, что Windows имел некоторую поддержку POSIX в своем профессиональном издании, эта функциональность была в значительной степени упразднена в более поздних версиях операционной системы. Однако с 2016 года Microsoft представила подкапотный слой, известный как Windows Subsystem for Linux (WSL), который позволяет запускать Linux-приложения на Windows, обеспечивая тем самым некоторую совместимость с POSIX.
В заключение, POSIX служит важным инструментом для разработчиков программного обеспечения, стремящихся создавать переносимые и совместимые приложения для различных операционных систем, обеспечивая при этом единообразие и предсказуемость интерфейсов.