Linux

Что такое «POSIX»?

Что такое POSIX? Я читал статью в Википедии и читаю ее каждый раз, когда сталкиваюсь с этим термином. Дело в том, что я так и не понял, что это такое.

Может ли кто-нибудь объяснить мне это, объяснив также «необходимость использовать POSIX»?

Ответ 1

POSIX это семейство стандартов, разработанных IEEE для уточнения и унификации интерфейсов прикладного программирования (и вспомогательных вопросов, таких как утилиты командной строки), предоставляемых операционными системами Unix. Когда вы пишете свои программы, опираясь на стандарты POSIX, вы можете быть уверены, что сможете легко переносить их среди большого семейства производных Unix (включая Linux, но не ограничиваясь им!); если и когда вы используете какой-то API Linux, который не стандартизован как часть Posix, вам будет труднее, если и когда вы захотите перенести эту программу или библиотеку на другие Unix системы (например, MacOSX) в будущем.

Ответ 2

Самые важные вещи, которые определяет POSIX 7:

Значительно расширяет ANSI C, добавляя такие вещи, как:

  1. больше файловых операций: mkdir, dirname, symlink, readlink, link (hardlinks), poll(), stat, sync, nftw()

  2. процессы и потоки: fork, execl, wait, pipe, семафоры sem_*, общая память (shm_*), kill, параметры планирования (nice, sched_*), sleep, mkfifo, setpgid()

  3. работа в сети: socket()

  4. управление памятью: mmap, mlock, mprotect, madvise, brk()

  5. утилиты: регулярные выражения (reg*)

Эти API также определяют базовые системные концепции, от которых они зависят, например, fork требует концепции процесса. Многие системные вызовы Linux существуют для реализации определенной функции POSIX C API и обеспечения совместимости с Linux, например, sys_write, sys_read… Однако многие из этих системных вызовов также имеют специфические для Linux расширения. Основная реализация Linux для настольных систем: glibc, которая во многих случаях просто предоставляет неглубокую обертку для системных вызовов.

Утилиты CLI

Например: 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 добавляет:

  1. 126: команда найдена, но не исполняется.

  2. 127: команда не найдена.

  3. > 128: завершение по сигналу.

Но POSIX, похоже, не определяет правило 128 + SIGNAL_ID, используемое Bash: https://unix.stackexchange.com/questions/99112/default-exit-code-when-process-is-terminated.

Регулярные выражения

Существует два типа: 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.

Linux FHS значительно расширяет POSIX.

Имена файлов

  1. «/» является разделителем путей, NUL не может быть использован

  2. . cwd, … родитель

  3. переносимые имена файлов

  4. использовать не более 14 символов и 256 символов для полного пути

  5. может содержать только: a-zA-Z0-9._-

Соглашения API утилит командной строки

Не обязательны, используются в POSIX, но почти нигде больше, особенно в GNU. Правда, слишком ограничительные, например, только флаги с одной буквой (например, -a), никаких длинных версий с двойным дефисом (например, --all).

Несколько широко используемых условных обозначений:

1. -- означает stdin, где ожидается файл

2. -- завершает флаги, например, ls -- -l для вывода списка директории с именем -l

3. "POSIX ACLs" (списки контроля доступа), например, используемые в качестве бэкенда для setfacl. Эта функция была отозвана, но она была реализована в нескольких ОС, в том числе в Linux с помощью setxattr.

Что соответствует стандарту POSIX?

Многие системы строго следуют POSIX, но лишь немногие из них действительно сертифицированы Open Group, которая поддерживает стандарт. К числу сертифицированных относятся:

  1. OS X (Apple) X означает как 10, так и UNIX; это была первая POSIX-система Apple, выпущенная в 2001 году

  2. AIX (IBM)

  3. HP-UX (HP)

  4. Solaris (Oracle)

Большинство дистрибутивов Linux вполне соответствуют требованиям, но не сертифицированы, потому что не хотят платить за проверку соответствия. K-UX от Inspur и EulerOS от Huawei два сертифицированных примера.

Официальный список сертифицированных систем можно найти по адресу: https://www.opengroup.org/openbrand/register/.

Windows

Windows реализовала POSIX в некоторых своих профессиональных дистрибутивах.

Поскольку это была необязательная функция, программисты не могли полагаться на нее в большинстве приложений для конечных пользователей. Поддержка была упразднена в Windows 8.

В 2016 году был анонсирован новый официальный Linux-подобный API под названием «Windows Subsystem for Linux». Он включает системные вызовы Linux, работу ELF, части файловой системы /proc, Bash, GCC, (TODO, вероятно, glibc?), apt-get и многое другое: https://channel9.msdn.com/Events/Build/2016/P488 

Поэтому я считаю, что он позволит Windows выполнять большую часть POSIX, если не всю. Однако он ориентирован на разработчиков / развертывание, а не на конечных пользователей. В частности, не планируется предоставлять доступ к графическому интерфейсу Windows.

Cygwin это известный сторонний проект под GPL, который «обеспечивает значительную функциональность POSIX API» для Windows, но требует, чтобы вы «пересобирали свое приложение из исходников, если хотите, чтобы оно работало под Windows». MSYS2 это родственный проект, который, похоже, добавляет больше функциональности поверх Cygwin.

Ответ 3

POSIX (произносится /ˈpɒzɪks/) или «Portable Operating System Interface [for Unix]» — это название семейства родственных стандартов, определенных IEEE для определения интерфейса прикладного программирования (API), а также интерфейсов оболочки и утилит для программного обеспечения, совместимого с вариантами операционной системы Unix, хотя стандарт может применяться к любой операционной системе. По сути, это был набор мер, призванных облегчить разработку и использование различных вариантов UNIX за счет наличия (в основном) общего API и утилит. Ограниченное соответствие POSIX также распространялось на различные версии Windows.

Ответ 4

Позвольте мне дать «неофициальное» объяснение.

POSIX это набор стандартов, который пытается отличить «UNIX» и UNIX-подобные системы от тех, которые с ними несовместимы. Он был создан правительством США в целях закупок. Идея заключалась в том, что федеральные закупки США нуждались в способе юридического определения требований для различного рода предложений и контрактов таким образом, который можно было бы использовать для исключения систем, на которые данная существующая кодовая база или штат программистов НЕ переносится.

Поскольку POSIX был написан постфактум... для описания слабо похожего набора конкурирующих систем... он НЕ был написан таким образом, чтобы его можно было реализовать. Так, например, NT от Microsoft была написана с достаточным соответствием POSIX, чтобы претендовать на некоторые предложения... хотя подсистема POSIX была по существу бесполезна с точки зрения практической переносимости и совместимости с системами UNIX. На протяжении десятилетий были написаны и другие стандарты для UNIX. Такие, как SPEC1170 (определял одиннадцать сотен семьдесят вызовов функций, которые должны были быть реализованы совместимо), и различные воплощения SUS (Single UNIX Specification). По большей части эти «стандарты» были неадекватны для любого практического технического применения. Они существуют в основном для споров, юридических препирательств и других неблагоприятных причин.

Схожие статьи

Linux

Допустимая средняя нагрузка на сервер

Linux

Как узнать максимальное количество потоков на процесс в Linux?

Установка Linux и Ubuntu на Mac: пошаговая инструкция
Linux

Установка Linux и Ubuntu на Mac: пошаговая инструкция

Linux

Как лучше всего послать сигнал всем членам группы процессов