我从来没有真正明白:什么是POSIX?

什么是POSIX? 我阅读了维基百科的文章 ,每当遇到这个词,我都会读它。 事实是,我从来没有真正明白它是什么。

任何人都可以解释“对POSIX的需要”给我解释吗?

POSIX是由IEEE指定的一系列标准,用于阐明和统一由Unix-y操作系统提供的应用程序编程接口(以及辅助问题,如命令行shell程序)。 当你编写依赖于POSIX标准的程序的时候,你可以很容易地将它们移植到Unix系列衍生产品(包括Linux,但不限于它)中。 如果当您使用某些未经标准化的Linux API作为Posix的一部分时,如果您将来想要将该程序或库移植到其他Unix-y系统(例如MacOSX),您将会遇到麻烦。

POSIX 7定义的最重要的东西

  1. C API

    大大延伸ANSI C的东西,如:

    • 更多文件操作: mkdirdirnamesymlinkreadlinklink (hardlinks), pollsync
    • 进程和线程: forkexeclpipe ,semaphors sem_* ,共享内存( shm_* ), kill ,调度参数( nicesched_ ), sleep
    • 联网
    • 常用expression
    • 先进的内存pipe理: mmapmlockmprotectmadvise

    这些API也决定了它们依赖的基本系统概念,例如fork需要一个过程的概念。

    许多Linux系统调用存在实现特定的POSIX C API函数,并使Linux兼容,例如sys_writesys_read ,…

    主要的Linux桌面实现:glibc,在许多情况下,它只是提供了一个浅层包装到系统调用。

  2. CLI实用程序

    例如: cdlsecho ,…

    许多实用程序都是相应C API函数的直接shell前端,例如mkdir

    主要的Linux桌面实现:小的GNU Coreutils,大的单独的GNU项目: sedgrepawk ,…某些CLI实用程序由Bash 作为内build实现 。

  3. 壳牌语言

    例如, a=b; echo "$a" a=b; echo "$a"

    主要的Linux桌面实现:GNU Bash。

  4. 环境variables

    例如: HOMEPATH

  5. 程序退出状态

    ANSI C说成功为0EXIT_SUCCESS ,失败为EXIT_FAILURE ,剩下的实现定义。

    POSIX补充说:

    • 126 :命令发现但不可执行。

    • 127 :找不到命令。

    • > 128 :由信号终止。

      但POSIX似乎没有指定Bash使用的128 + SIGNAL_ID规则: https : 128 + SIGNAL_ID

  6. 正则expression式

    有两种types:BRE(基本)和ERE(扩展)。 基本不推荐使用,只能保持不中断API。

    这些是通过C API函数实现的,并在整个CLI实用程序中使用,例如, grep默认接受BRE,ERE使用-E

    例如: echo 'a.1' | grep -E 'a.[[:digit:]]' echo 'a.1' | grep -E 'a.[[:digit:]]'

    主要的Linux实现:glibc实现regex.h下的函数,像grep这样的程序可以用作后端。

  7. 目录结构

    例如: /dev/null/tmp

    Linux FHS极大地扩展了POSIX。

  8. 文件名

    • /是path分隔符
    • NUL不能使用
    • .cwd..父母
    • 便携文件名
      • 最多使用最多14个字符和256个完整path
      • 只能包含: a-zA-Z0-9._-

    另请参阅: 文件系统的posix合规性是什么?

  9. 命令行实用程序API约定

    不是强制性的,由POSIX使用,但几乎没有其他地方,特别是不在GNU。 但是的确如此,限制性太强,例如只有单字母标志(例如-a ),没有双连字符长版本(例如--all )。

    一些广泛使用的约定:

    • -意味着stdin预期的文件
    • --终止标志,例如ls -- -l列出名为-l的目录

    另请参阅: Linux命令行开关和参数是否有标准?

谁符合POSIX?

许多系统紧跟POSIX,但很less有实际上由维持该标准的Open Groupauthentication。 值得注意的authentication包括:

  • OS X(Apple)X代表10和UNIX。 是2001年左右发布的第一个苹果POSIX系统。另见: OSX是POSIX操作系统吗?
  • AIX(IBM)
  • HP-UX(HP)
  • Solaris(Oracle)

大多数Linux发行版都非常合规,但没有通过authentication,因为他们不想支付合规性检查。

请参阅wiki页面 。

视窗

Windows在其一些专业发行版上实现了POSIX。

由于这是一个可选function,程序员不能依赖于它为大多数最终用户应用程序。

Windows 8中不支持支持:

在2016年,一种名为“Windows Linux子系统”的官方类似Linux的API被宣布。 它包括Linux系统调用,ELF运行, /proc文件系统的部分,Bash,GCC,(TODO可能是glibc?), apt-get等等: https : //channel9.msdn.com/Events/Build/2016/P488所以我相信这将允许Windows运行很多,如果不是全部,POSIX。 但是,它的重点是开发人员/部署,而不是最终用户。 特别是,没有计划允许访问Windows GUI。

官方Microsoft POSIX兼容性的历史概述: http : //brianreiter.org/2010/08/24/the-sad-history-of-the-microsoft-posix-subsystem/

Cygwin是一个众所周知的GPL第三方项目,它为Windows“提供了实质性的POSIX APIfunction”,但要求您“如果您希望在Windows上运行,请从源代码重新构build您的应用程序”。 MSYS2是一个相关的项目,似乎在Cygwin之上添加了更多的function。

Android的

Android POSIX兼容?

奖金水平

Linux标准库进一步扩展了POSIX。

使用非帧索引,它们更具可读性和可search性: http : //pubs.opengroup.org/onlinepubs/9699919799/nfindex.html

获取完整的压缩版本的HTML页面以进行grepping: 是否有POSIX API /函数的列表?

POSIX是:

POSIX(发音为/pɒzɪks/)或“便携式操作系统接口[用于Unix]” 1是由IEEE指定的用于定义应用程序编程接口(API)的相关标准族的名称,以及用于软件的shell和实用程序接口兼容Unix操作系统的变体,尽pipe标准可以适用于任何操作系统。

基本上,这是一套措施,通过拥有(大部分)通用的API和实用程序来缓解开发和使用不同UNIX版本的痛苦。 有限的POSIX合规性也扩展到各种版本的Windows。

让我给出粗俗的“非官方”的解释。

POSIX是一组试图将“UNIX”和类UNIX系统区分开来的标准。 它是由美国政府为采购目的而创build的。 这个想法是,美国的联邦采购需要一种方式来合法地规定各种投标和合同的要求,这种方式可以用来排除现有的代码库或编程人员不能移植的系统。

由于POSIX是事后编写的…来描述一个类似松散的竞争系统集……它不是以可以实现的方式编写的。

所以,举个例子来说,微软的NT在编写时已经具有足够的符合POSIX标准的资格,即使POSIX子系统在实际的可移植性和与UNIX系统的兼容性方面实质上是无用的。

几十年来,各种其他的UNIX标准已经被编写出来。 像SPEC1170(指定一千一百七十个函数调用必须兼容)以及SUS(单一UNIX规范)的各种版本。

这些“标准”大部分都不适用于任何实际的技术应用。 他们大多存在争议,法律纠纷和其他function障碍的原因。

POSIX是由IEEE和The Open Group提出的一套标准,描述了理想的Unix如何运作。 程序员,用户和pipe理员都可以熟悉POSIX文档,并期望一个POSIX投诉Unix提供所有提到的标准工具。

由于每一个Unix的操作方式都有所不同,Solaris,Mac OS X,IRIX,BSD和Linux都有它们的怪癖 – POSIX对于业界人士来说特别有用,因为它定义了一个标准的运行环境。例如, C库中的大部分函数都基于POSIX; 因此程序员可以在他的应用程序中使用一个程序员,并期望它在大多数Unices中performance相同。

但是,Unix的分歧领域通常是重点,而不是标准领域。

关于POSIX的好处是,欢迎您自己阅读:

开放组织基本规格问题7

第7期被称为POSIX.1-2008,其中有一些新的东西 – 然而,POSIX.1的Google-fu可以让你看到Unix背后的全部历史。

POSIX是一个操作系统的标准,它可以使编写跨平台软件变得更容易。 在Unix的世界里,这是一个特别重要的事情。

1985年,来自整个计算机行业公司的个人共同开发了主要基于UNIX系统V接口定义(SVID)和其他标准化工作的POSIX(计算机环境便携式操作系统接口)标准。 这些努力得到了美国政府的推动,这需要一个标准的计算环境来减less培训和采购成本。 POSIX于1988年发布,是一组IEEE标准,为操作系统定义了API,shell和实用程序接口。 尽pipe针对类UNIX系统,这些标准可以适用于任何兼容的操作系统。 现在,这些标准已经被接受,软件开发人员能够开发在所有合适版本的UNIX,Linux和其他操作系统上运行的应用程序。

从这本书:Linux实用指南

这个标准为Unix类操作系统提供了一个共同的基础。 它指定了shell应该如何工作,从ls和grep这样的命令中可以得到什么,以及一些C作者可以使用的C库。

例如,命令行用户用来串行命令的pipe道在这里详细说明,这意味着C的popen(pipe道打开)function是POSIX标准的,而不是ISO C标准。

POSIX为操作系统或程序定义了一套标准。 目标是编写与类UNIX系统兼容的新软件。

例如,在Linux上运行的程序也可以在其他类UNIX系统(如Solaris,HP-UX和AIX等)上编译和运行。

最stream行的例子是GNU Bash ,它是100%POSIX合规性和gawk工具。

Posixpipe理着互操作性,可移植性以及诸如fork,权限和文件系统标准(如/ etc,/ var,/ usr等)的使用和机制。 因此,当开发者在诸如Linux之类的Posix兼容系统下编写程序时,通常并不总是保证在诸如IBM的AIX系统或Unix的其他商业变体的其他符合posix的系统上运行。 Posix是一个好东西,因此它可以简化软件开发,实现最大的可移植性。 希望这个答案是有道理的。

感谢杰德史密斯和Tinkertim指出我的错误 – 我的坏! 🙁

Posix更像是一个操作系统,它是一个“操作系统标准”。 你可以把它想象成一个虚构的操作系统,它实际上并不存在,但它有一个文档。 这些论文是美国大型标准组织IEEE所定义的“posix标准”。 实现这个规范的操作系统是“Posix兼容的”。

政府法规在其投资中更喜欢符合Posix标准的解决scheme,因此符合Posix标准具有显着的财务优势,特别是对于美国的大型IT公司。

操作系统完全符合posix标准,这是一个保证,它将无缝地编译和运行所有Posix兼容的应用程序。

Linux是最知名的一个。 OSX,Solaris,NetBSD和Windows NT也在这里玩。 FreeBSD和OpenBSD只是“接近”Posix兼容的。 WinNT的posix合规只是一个假的解决scheme,以避免上述的政府监pipe。