что именно posix?

<p>я вижу, что posix упоминается часто и везде, и я предполагал, что он является базовым стандартом unix ... пока я не заметил следующую выдержку на странице википедии: <a href="http://en.wikipedia.org/wiki/the\_open\_group"><em> открытая группа</em></a> знак равно</p><blockquote> <p>open group наиболее известна как орган по сертификации товарного знака unix и публикации технического стандарта <em> single unix specification</em>, <strong> <em> который расширяется стандарты posix и является официальным определением системы unix</em> </strong>.</p> </blockquote><p>если официальное определение системы unix является расширением posix, то что такое posix? это, безусловно, кажется пробным камнем в мире unix, но я не знаю, как это вписывается в общую картину.</p>

<p>posix впервые был стандартом в 1988 году, задолго до спецификации single unix. это была одна из попыток объединения всех различных вилок unix и unix-подобных систем. posix является стандартом ieee, но поскольку ieee не владеет торговой маркой unix, стандартом не является unix, хотя он основан на существующем api-интерфейсе unix в то время. первый стандарт posix.1 формально известен как ieee std 1003.1-1988. [ <a href="http://en.wikipedia.org/wiki/posix">1</a> ] ieee взимает значительную плату за получение копии стандарта.</p><p>open group выпустила единую спецификацию unix (susv2) в 1997 году на основе работы ieee по стандарту posix. susv3 был выпущен в 2001 году совместной рабочей группой ieee и the open group, известной как austin group. susv3 также известен как posix: 2001 [ <a href="http://en.wikipedia.org/wiki/single\_unix\_specification">2</a> ]. теперь есть также posix: 2004 и posix: 2008, которые являются ядром susv4. что касается unix, unix - это то, что текущий <em> зарегистрированный </em> владелец торговой марки говорит, что это так. с 1994 года это открытая группа.</p><p>novell приобрела бизнес систем unix у at & t/usl, где и родился unix. в 1994 году они продали право на товарный знак unix компании x/open [], теперь известной как the open group. затем они продали исходный код unix sco как unixware. [] сам unix много раз разветвлялся [ <a href="http://www.levenez.com/unix/">4</a> ] [ <a href="http://www.bell-labs.com/history/unix/">5</a> ] частично из-за модели лицензирования at & t. закупка unix предоставила вам полный исходный код операционной системы и полную цепочку инструментов для ее создания. изменения в этом источнике могут распространяться и использоваться любым который владел лицензией на unix от at & t. плата за лицензию исчислялась тысячами.</p><p>bsd был проектом в беркли, который добавил ряд улучшений в операционную систему unix. код bsd был выпущен под гораздо более либеральной лицензией, чем исходный код at & t, и для него не требовалась лицензионная плата или даже требование распространяться вместе с исходным кодом, в отличие от gpl, которую используют gnu project и linux). это привело к тому, что значительная часть кода bsd была включена в различные коммерческие вилки unix. к моменту выпуска 4.3bsd они практически заменили любую потребность в исходном исходном коде at & t unix. freebsd/netbsd/openbsd - это все форки 4.3bsd. которые представляют собой законченную операционную систему и не имеют исходного кода at & t. они также не имеют права на товарный знак unix, но большая часть их кода используется коммерческими операционными системами unix. socket api, используемый в unix, был разработан на bsd и код быстрой файловой системы unix был заимствован и использован в различных операционных системах unix, таких как solaris, со своими собственными усовершенствованиями.</p><p>linux был разработан в 1991 году, но был разработан с нуля в отличие от bsd и использует существующий проект gnu, который представляет собой реализацию чистой комнаты большей части пользовательского пространства unix. он реализует большую часть posix для совместимость и имеет unix-подобный дизайн, но не имеет тесной связи с at & t или unix, которую имеют bsd.</p>

<p><strong> самые важные вещи <a href="http://pubs.opengroup.org/onlinepubs/9699919799/nfindex.html">posix 7</a> определяет </strong></p><ol> <li> <p> <a href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/contents.html">c api</a> </p> <p>отлично <a href="https://stackoverflow.com/questions/9376837/difference-bewteen-c-standard-library-and-c-posix-library/37969420#37969420">расширяет ansi c</a> такими вещами, как:</p> <ul> <li>другие файловые операции: <code>mkdir</code>, <code>dirname</code>, <code>symlink</code>, <code>readlink</code>, <code>link</code> (жесткие ссылки), <a href="https://stackoverflow.com/questions/12444679/how-does-the-poll-c-linux-function-work/44127590#44127590"><code>poll()</code></a> , <code>stat</code>, <code>sync</code>, <a href="https://stackoverflow.com/questions/8436841/how-to-recursively-list-directories-in-c-on-linux/29402705"><code>nftw()</code></a> </li> <li>процесс и потоки: <code>fork</code>, <code>execl</code>, <a href="https://stackoverflow.com/questions/7248031/meaning-of-dollar-question-mark-in-shell-scripts/57303942#57303942"><code>wait</code></a> , <code>pipe</code>, семафоры <a href="https://stackoverflow.com/questions/16400820/how-to-use-posix-semaphores-on-forked-processes-in-c/52042490#52042490"><code>sem\_*</code></a> , общая память (<code>shm\_*</code>), <code>kill</code>, параметры планирования (<code>nice</code>, <code>sched\_*</code>), <code>sleep</code>, <code>mkfifo</code>, <a href="https://stackoverflow.com/questions/6108953/how-does-ctrl-c-terminate-a-child-process/52042970#52042970"><code>setpgid()</code></a> </li> <li>сеть: <a href="https://stackoverflow.com/questions/11208299/how-to-make-an-http-get-request-in-c-without-libcurl/35680609#35680609"><code>socket()</code></a> </li> <li>управление памятью: <code>mmap</code>, <code>mlock</code>, <code>mprotect</code>, <code>madvise</code>, <a href="https://stackoverflow.com/questions/6988487/what-does-the-brk-system-call-do/31082353#31082353"><code>brk()</code></a> </li> <li>утилиты: регулярные выражения (<code>reg*</code>)</li> </ul> <p>эти api также определяют основные концепции системы, от которых они зависят, например, <code>fork</code> требует концепции процесса.</p> <p>многие <a href="https://unix.stackexchange.com/questions/421750/where-do-you-find-the-syscall-table-for-linux">системные вызовы linux</a> существуют для реализации конкретной функции api posix c и обеспечения совместимости с linux, например, <code>sys\_write</code>, <code>sys\_read</code>, ... однако многие из этих системных вызовов также имеют специфичные для linux расширения.</p> <p>основная реализация linux для настольных компьютеров: glibc, которая во многих случаях просто обеспечивает поверхностную оболочку для системных вызовов.</p> </li> <li> <p> <a href="http://pubs.opengroup.org/onlinepubs/9699919799/utilities/contents.html">утилиты cli</a> </p> <p>например: <code>cd</code>, <code>ls</code>, <code>echo</code>, ...</p> <p>многие утилиты являются прямыми интерфейсами shell для соответствующей функции c api, например <code>mkdir</code>.</p> <p>основная реализация linux для настольных пк: gnu coreutils для маленьких, отдельные gnu проекты для больших: <code>sed</code>, <code>grep</code>, <code>awk</code>, ... некоторые утилиты cli реализованы с помощью bash <a href="https://unix.stackexchange.com/questions/11454/what-is-the-difference-between-a-builtin-command-and-one-that-is-not">как встроенные модули</a> .</p> </li> <li> <p> <a href="http://pubs.opengroup.org/onlinepubs/9699919799/utilities/v3\_chap02.html#tag\_18">язык оболочки</a> </p> <p>например, <code>a=b; echo "$a"</code></p> <p>основная реализация рабочего стола linux: <a href="https://en.wikipedia.org/wiki/bash\_(unix\_shell)">gnu bash</a> .</p> </li> <li> <p> <a href="http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/v1\_chap08.html#tag\_08">переменные среды</a> </p> <p>например: <code>home</code>, <code>path</code>.</p> <p><code>path</code> <a href="http://pubs.opengroup.org/onlinepubs/9699919799/utilities/v3\_chap02.html#tag\_18\_09\_01\_01">семантика поиска указана</a> , включая <a href="https://stackoverflow.com/questions/6331075/why-do-you-need-dot-slash-before-executable-or-script-name-to-run-it-in-bas/6331085#6331085">как косые черты предотвращают <code>path</code> поиск</a> .</p> </li> <li> <p> <a href="http://pubs.opengroup.org/onlinepubs/9699919799/utilities/v3\_chap02.html#tag\_18\_08">статус выхода из программы</a> </p> <p>ansi c говорит <code>0</code> или <code>exit\_success</code> для успеха, <code>exit\_failure</code> для сбоя и оставляет определение остальной реализации определенным.</p> <p>posix добавляет:</p> <ul> <li> <p><code>126</code>: команда найдена, но не выполняется.</p> </li> <li> <p><code>127</code>: команда не найдена.</p> </li> <li> <p><code>> 128</code>: завершается сигналом.</p> <p>но posix, похоже, не определяет правило <code>128 + signal\_id</code>, используемое bash: <a href="https://unix.stackexchange.com/questions/99112/default-exit-code-when-process-is-terminated">код завершения по умолчанию при завершении процесса?</a> </p> </li> </ul> </li> <li> <p> <a href="http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/v1\_chap09.html#tag\_09">регулярное выражение</a> </p> <p>существует два типа: bre (базовый) и ere (расширенный). basic устарел и поддерживается только для того, чтобы не нарушать api.</p> <p>они реализуются функциями api c и используются в утилитах cli, например, <code>grep</code> принимает bre по умолчанию и ere с <code>-e</code>.</p> <p>например: <code>echo 'a.1' | grep -e 'a.[[:digit:]]'</code></p> <p>основная реализация linux: glibc реализует функции в <a href="http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/regex.h.html">regex.h</a> , которые такие программы, как <code>grep</code>, могут использовать в качестве бэкэнда.</p> </li> <li> <p> <a href="http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/v1\_chap10.html#tag\_10">справочник struture</a> </p> <p>например: <code>/dev/null</code>, <code>/tmp</code></p> <p>linux <a href="https://en.wikipedia.org/wiki/filesystem\_hierarchy\_standard"> fhs </a> значительно расширяет posix.</p> </li> <li> <p> <a href="http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/v1\_chap03.html#tag\_03\_267">имена файлов</a> </p> <ul> <li><code>/</code> это разделитель пути</li> <li><code>nul</code> нельзя использовать</li> <li><code>.</code> является родителем <code>cwd</code>, <code>..</code></li> <li>переносимые имена файлов <ul> <li>используйте максимум 14 символов и 256 для полного пути</li> <li>может содержать только: <code>a-za-z0-9.\_-</code></li> </ul> </li> </ul> <p>смотрите также: <a href="https://stackoverflow.com/questions/18550253/what-is-posix-compliance-for-filesystem">https://stackoverflow.com/questions/18550253/what-is-posix-compliance-for-filesystem</a> </p> </li> <li> <p> <a href="http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/v1\_chap12.html">соглашения api утилиты командной строки</a> </p> <p>не обязательно, используется posix, но почти нигде, особенно в gnu. но правда, это слишком ограничительно, например, только однобуквенные флаги (например, <code>-a</code>), без длинных версий с двумя дефисами (например, <code>--all</code>).</p> <p>несколько широко используемых соглашений:</p> <ul> <li><code>-</code> означает стандартный ввод файла, в котором ожидается файл</li> <li><code>--</code> закрывает флаги, например <code>ls -- -l</code> для просмотра каталога с именем <code>-l</code></li> </ul> <p>смотрите также: <a href="https://stackoverflow.com/questions/8957222/are-there-standards-for-linux-command-line-switches-and-arguments">https://stackoverflow.com/questions/8957222/are-there-standards-for-linux-command-line-switches-and-arguments</a> </p> </li> <li> <p>"posix acl" (списки контроля доступа), например, используется как бэкэнд для <a href="https://askubuntu.com/questions/487527/give-specific-user-permission-to-write-to-a-folder-using-w-notation/809562#809562"><code>setfacl</code></a> .</p> <p>это <a href="https://unix.stackexchange.com/questions/489820/why-was-posix-1e-withdrawn">было отозвано</a> , но оно было реализовано в нескольких ос, включая <a href="https://www.linuxquestions.org/questions/linux-kernel-70/system-call-to-set-file-acls-in-linux-537615/#post5988355">в linux с <code>setxattr</code></a> .</p> </li> </ol><p><strong> кто соответствует posix? </strong></p><p>многие системы строго следуют posix, но немногие фактически сертифицированы open group, которая поддерживает стандарт. известные сертифицированные включают в себя:</p><ul> <li>os x (apple) x обозначает как 10, так и unix. была первой apple posix, выпущенная около 2001 года. см. также: <a href="https://stackoverflow.com/questions/5785516/is-osx-a-posix-os">https://stackoverflow.com/questions/5785516/is-osx-a-posix-os</a> знак равно</li> <li>aix (ibm)</li> <li>hp-ux (hp)</li> <li>солярис (оракул)</li> </ul><p>большинство дистрибутивов linux очень совместимы, но не сертифицированы, поскольку не хотят оплачивать проверку соответствия. <a href="https://en.wikipedia.org/wiki/inspur\_k-ux">inspur k-ux</a> и <a href="https://www.huawei.com/en/press-events/news/2016/9/huawei-kunlun-euleros-unix-certification">huawei euleros</a> - два сертифицированных примера.</p><p>официальный список сертифицированных систем можно найти по адресу: <a href="https://www.opengroup.org/openbrand/register/">https://www.opengroup.org/openbrand/register/</a> , а также на <a href="https://en.wikipedia.org/wiki/posix#posix-oriented\_operating\_systems">вики-страница</a> .</p><p><strong> окна </strong></p><p>windows внедрила posix в некоторых своих профессиональных дистрибутивах.</p><p>поскольку это была необязательная функция, программисты не могли полагаться на нее для большинства приложений конечного пользователя.</p><p>поддержка устарела в windows 8:</p><ul> <li> <a href="https://stackoverflow.com/questions/4746043/where-does-microsoft-windows-7-posix-implementation-currently-stand">https://stackoverflow.com/questions/4746043/where-does-microsoft-windows-7-posix-implementation-currently-stand</a> </li> <li> <a href="https://superuser.com/questions/495360/does-windows-8-still-implement-posix">https://superuser.com/questions/495360/does-windows-8-still-implement-posix</a> </li> <li>запрос функции: <a href="https://windows.uservoice.com/forums/265757-windows-feature-suggestions/suggestions/6573649-full-posix-support">https://windows.uservoice.com/forums/265757-windows-feature-suggestions/suggestions/6573649-full-posix-support</a> </li> </ul><p>в 2016 году был объявлен новый официальный linux-подобный api под названием "windows subsystem for linux". он включает системные вызовы linux, запуск elf, части файловой системы <code>/proc</code>, bash, gcc, (вероятно, todo glibc?), <code>apt-get</code> и другие: <a href="https://channel9.msdn.com/events/build/2016/p488">https: // channel9. msdn.com/events/build/2016/p488</a> так что я считаю, что это позволит windows запускать большую часть, если не всю, posix. однако он ориентирован на разработчиков/развертывание, а не на конечных пользователей. в частности, не было планов разрешить доступ к графическому интерфейсу windows.</p><p>исторический обзор официальной совместимости microsoft posix: <a href="http://brianreiter.org/2010/08/24/the-sad-history-of-the-microsoft-posix-subsystem/">http://brianreiter.org/2010/08/24/the-sad-history-of-the-microsoft-posix-subsystem/</a> </p><p> <a href="http://www.cygwin.com/">cygwin</a> - это хорошо известный сторонний проект gpl, который "обеспечивает существенные функциональные возможности api posix" для windows, но требует, чтобы вы "перестраивали свое приложение из исходного кода, если хотите, чтобы оно работало в windows". <a href="https://sourceforge.net/projects/msys2/">msys2</a> это связанный проект, который, кажется, добавляет больше функциональности поверх cygwin.</p><p><strong> android </strong></p><p>android имеет собственную библиотеку c (bionic), которая не полностью поддерживает posix с android o: <a href="https://stackoverflow.com/questions/27604455/is-android-posix-compatible">https://stackoverflow.com/questions/27604455/is-android-posix -совместим</a> </p><p><strong> бонусный уровень </strong></p><p> <a href="https://en.wikipedia.org/wiki/linux\_standard\_base">стандартная база linux</a> расширяет возможности posix.</p><p>используйте некадровые индексы, они намного более читабельны и доступны для поиска: <a href="http://pubs.opengroup.org/onlinepubs/9699919799/nfindex.html">http://pubs.opengroup.org/onlinepubs/9699919799/nfindex.html</a> </p><p>получить полную упакованную версию html-страниц для поиска: <a href="https://stackoverflow.com/questions/453993/is-there-a-listing-of-the-posix-api-functions/45832939#45832939">https://stackoverflow.com/questions/453993/is-there-a-listing-of-the-posix-api-functions/45832939#45832939</a> </p>

<p>posix - это стандарт портативной операционной системы. он описывает некоторые утилиты, api и сервисы, которые совместимая операционная система должна предоставлять программному обеспечению (например, сокеты, файловый ввод-вывод и многопоточность), а также соглашения о том, как их следует вызывать из программы.</p><p>идея состоит в том, что программу, написанную для одной posix-совместимой ос, было бы проще перенести на другую posix-совместимую ос, чем перенос между не posix-совместимыми ос. вот почему гораздо проще перенести приложение, скажем, с freebsd на linux, чем с freebsd на windows (хотя windows якобы поддерживает подмножество posix).</p>

<p>posix - это подмножество unix, которое предназначено для охвата различных unix-подобных сред для других операционных систем; это изначально включало такие среды, как eunice для vms, posix-личность windows nt и apollo domain/os. вы можете думать об этом как о стандартном api переносимости для подмножества сервисов операционной системы, поведение которых является общим для unix и не-unix. смотрите <a href="http://standards.ieee.org/develop/wg/posix.html">http://standards.ieee.org/develop/wg/posix.html</a> для получения дополнительной информации.</p>