“ POSIX”是什么意思?


898

什么是POSIX?我已阅读Wikipedia文章,每次遇到该术语时都会阅读。事实是我从来没有真正了解过它是什么。

任何人都可以通过解释“ POSIX的需求”来向我解释吗?



Answers:


622

POSIXIEEE指定的一系列标准,用于阐明和统一Unix-y操作系统提供的应用程序编程接口(以及附属问题,例如命令行外壳实用程序)。当您编写依赖于POSIX标准的程序时,可以肯定地将它们轻松移植到大量的Unix派生系列中(包括Linux,但不仅限于此!);如果并且当您使用某些未作为Posix一部分标准化的Linux API时,如果将来要将该程序或库移植到其他Unix-y系统(例如MacOSX)上,您将很难。


34
不,该标准是在API级别上进行的-每个指定的调用都可以在内核中实现,也可以在C库中实现另一个调用,这对于Posix(以及您的程序;-)也很好。MacOSX兼容Posix,请参阅devworld.apple.com/leopard/overview/osfoundations.html。对于Windows,请参阅en.wikipedia.org/wiki/POSIX#POSIX_for_Windows:尽管您可以通过en.wikipedia的 Cygwin获得部分支持,但Posix合规性目前仅包括在Enterprise和Ultimate版本中(不包括在便宜的版本中!)。 org / wiki / Cygwin
亚历克斯·马特利

23
您的评论是有缺陷的,因为至少在Microsoft在台式机上的市场份额使它“成为了世界”。
杰德·史密斯

29
我认为,爪子的意思是微软不会花太多精力与其他平台进行互操作。
mipadi

12
@deltaray 拥抱,延伸和扑灭。MS Java(非标准java.util。java.security,java.io,java.lang和java.awt),Internet Explorer(几乎说“ exploder”)和.NET(是的,我知道他们已经发布了部分.NET的源代码,但它的许可证是限制性的,并且还不是Linux端口。Mono不完整)。另外,exFAT专利。你是绝对正确的。
Wyatt8740 2015年

25
Microsoft's market share on desktops, at least, makes it "what the world follows"-有趣的是,自2009年发表此评论以来,情况发生了很大变化:)
GMA

513

POSIX 7定义的最重要内容

  1. C API

    极大地扩展了ANSI C,例如:

    • 更多文件操作:mkdirdirnamesymlinkreadlinklink(硬链接)poll()statsyncnftw()
    • 处理和线程:forkexeclwaitpipe,semaphors sem_*,共享存储器(shm_*), kill,调度参数(nicesched_*), ,,sleepmkfifosetpgid()
    • 联网: socket()
    • 内存管理:mmapmlockmprotectmadvisebrk()
    • 实用程序:正则表达式(reg*

    这些API还确定它们所依赖的基础系统概念,例如,fork需要过程的概念。

    很多Linux系统调用存在实现特定的POSIX C API函数使Linux兼容的,例如sys_writesys_read,...许多这些系统调用的也有特定的Linux的扩展不过。

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

  2. CLI实用程序

    如:cdlsecho,...

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

    主要的Linux桌面实现:GNU Coreutils的为小的,独立的GNU项目为大的:sedgrepawk,...一些CLI工具类猛砸实现为内置插件

  3. 外壳语言

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

    主要的Linux桌面实现:GNU Bash

  4. 环境变量

    如:HOMEPATH

    PATH 指定了搜索语义,包括斜杠如何阻止PATH搜索

  5. 程序退出状态

    ANSI C表示成功0还是失败,并定义了其余实现。EXIT_SUCCESSEXIT_FAILURE

    POSIX添加:

  6. 正则表达式

    有两种类型:BRE(基本)和ERE(扩展)。不推荐使用Basic,并且仅保留不破坏API。

    这些由C API函数实现,并在整个CLI实用程序中使用,例如grep,默认情况下接受BRE ,并使用接受ERE -E

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

    主要的Linux实现:glibc实现regex.h下的功能,这些程序grep可以用作后端。

  7. 目录结构

    如:/dev/null/tmp

    Linux FHS大大扩展了POSIX。

  8. 档名

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

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

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

    不是强制性的,由POSIX使用,但是几乎没有其他地方,尤其是在GNU中。但是,确实如此,它太严格了,例如仅使用单个字母标志(例如-a),不使用双连字符长版本(例如--all)。

    一些广泛使用的约定:

    • - 表示标准文件所在的位置
    • --终止标志,例如ls -- -l列出名为-l

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

  10. “ POSIX ACL”(访问控制列表),例如,用作的后端setfacl

    该操作已撤消,但已在多个OS中实现,包括在Linux中使用setxattr

谁符合POSIX?

许多系统都严格遵循POSIX,但实际上很少有人通过维护该标准的Open Group进行认证。著名的认证产品包括:

  • OS X(Apple)X代表10和UNIX。是第一个大约在2001年发布的Apple POSIX系统。另请参见:OSX是POSIX OS吗?
  • AIX(IBM)
  • HP-UX(HP)
  • Solaris(Oracle)

大多数Linux发行版都非常合规,但未通过认证,因为它们不想支付合规性检查。浪潮的K-UX华为的EulerOS是两个获得认证的示例。

认证系统的官方列表可在以下网址找到:https : //www.opengroup.org/openbrand/register/以及Wiki页面

视窗

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

由于它是一项可选功能,因此程序员无法将其用于大多数最终用户应用程序。

Windows 8已弃用该支持:

在2016年,一个新的类似Linux的正式API称为“ Windows的Linux子系统”。它包括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 API功能”,但是要求“如果希望在Windows上运行,请从源代码重建应用程序”。MSYS2是一个相关项目,似乎在Cygwin之上添加了更多功能。

安卓系统

Android具有其自己的C库(仿生),该库自Android O起不完全支持POSIX:Android POSIX兼容吗?

奖金等级

Linux标准基础进一步扩展POSIX。

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

获取HTML页面的完整压缩版本以进行grepping: POSIX C API函数的列表在哪里?


17
很棒的例子,如果您有一个定义以及接受的答案,那将是最佳答案。
Marc 2015年

8
@马克谢谢!我尽量不重复什么是在其他的答案说,人们可能已经阅读这些并避免重复;-)这是一个已知的两难境地:meta.stackoverflow.com/questions/305645/...
西罗桑蒂利冠状病毒审查六四事件法轮功

1
实际解释POSIX涵盖哪些内容(不包括哪些内容)的好主意。
sleske

4
文献中到处都有提到“ POSIX遵从性”的内容,人们发现POSIX的典型定义是“一套用于类Unix操作系统之间互操作性的标准”。尽管有用,但此定义引起了很多疑问,尤其是关于预期可以互操作的功能。当然,您可以阅读整个POSIX规范以深入研究细节(并花大量时间在上面)。但是,此答案提供了急需的摘要,以使您对POSIX的范围有个全面了解。特别感谢Ciro花时间编写它!
ARX

添加一些有关整数类型的Posix保证也可能很好。我不知道到底是什么还是没有指定什么,但是我知道Posix至少需要存在uint8_t,uint16_t,uint32_t和相应的带符号类型。我不确定是否可以保证像“ int”这样的类型具有2的幂数,并且系统是否不会像32个值位,1个符号位和31个填充位的“ int”那样令人讨厌[因此增加uint32_t可能会产生UB];如果您方便使用Standard,最好说一下在这方面有什么保证。
超级猫

74

POSIX是:

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

基本上,这是一套通过具有(主要是)通用的API和实用程序来减轻开发和使用UNIX不同风味的痛苦的措施。有限的POSIX合规性也扩展到了Windows的各种版本。


1.您的意思是POSIX说所有* nix操作系统(内核)都应至少具有这组系统调用。对?2. WINDOWS / MAC是否遵循POSIX?如果/否,WINDOWS(95,98,2000,xp,vista,7)是否遵循某些通用标准(可能是他们自己的专有)标准?换句话说,微软世界中的POSIX ==?
抓到

1
基本上,它“是”一套减轻发展痛苦的措施。是吗?
爪子

5
我质疑这个词的用法是否也是,但值得商de。要回答您的问题:(1)不,POSIX与内核完全无关,它仅描述了其工作方式;(2)OS X是BSD,完全符合POSIX,但是有灰色区域。Windows 2008最接近POSIX投诉;在Microsoft世界中没有POSIX的等效产品。
杰德·史密斯

1
@claws:并不是要弄污cletus的回答下的区域……但是。我在答案中链接了POSIX.1-2008。
杰德·史密斯

3
@Jed Smith,在Mac OS X合规性方面没有灰色区域;Mac OS X经过认证符合Single UNIX Specification v3,该标准是POSIX的子集。
Michael Aaron Safyan 09年

43

让我作怪异的“非正式”解释。

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

由于POSIX是在事后编写的,目的是描述一套大致相似的竞争系统,因此,它并不是以可以实现的方式编写的。

因此,例如,Microsoft的NT编写时具有足够的POSIX一致性,可以胜任某些竞标……即使就实际的可移植性和与UNIX系统的兼容性而言,POSIX子系统实际上是无用的。

数十年来,已经编写了各种其他的UNIX标准。诸如SPEC1170(必须兼容实现的指定的一百零七十个函数调用)和SUS(单一UNIX规范)的各种形式。

在大多数情况下,这些“标准”不足以适用于任何实际的技术应用。它们的存在主要是出于争论,法律争执和其他功能失调的原因。


1
那么Linux如何实现大多数POSIX,包括许多扩展?
ninjalj 2010年

8
@ninjalj:编写Linux是为了实现一组实用的类似UNIX的功能。在符合POSIX的同时这样做是很有意义的。但是,我的观点是,POSIX并不是作为用于实施新操作系统的规范而创建的……它是作为美国政府采购人员将符合特定条件的投标与不符合投标条件的投标区别开来的一种方法。 。Linux的重点是以合理兼容,健壮和高性能的方式提供可用功能。在此过程中,POSIX并非偶然。
Jim Dennis 2010年

3
相当有才华,您声称POSIX是事后编写的!这是一个良好的标准开发组织(SDO)的标志,在至少存在一个一致的实施方案之前,没有达成共识。
fpmurphy 2011年

4
@fpmurphy:基于一个或两个可互操作的实现创建事后规范是IETF ...网络协议标准的规范,该规范通过有意的松耦合进行交互。对于OS标准化,这并不是一个成功的过程。程序和系统(内核或微内核及其子系统服务器)之间的API比网络上的客户端和服务器或对等对象紧密耦合得多。(我并不是说这是不可能的;只是指出存在差异,而历史并没有表明后者是有希望的)。
Jim Dennis

2
IEEE于1985年指定POSIX的努力受到美国政府的鼓励。做一些研究,阅读历史书籍或其他东西。
rustyx

29

POSIX是用于操作系统的标准,可以简化编写跨平台软件的工作。在Unix世界中,这尤其重要。


15
它不仅使编写跨平台代码更容易,而且使编写跨平台代码更容易。唯一的例外是Windows,因为Microsoft认为Windows在某种程度上比其他所有人都要好,并且不需要遵守。但是,我预测这将对他们不利,特别是随着Mac和Linux赢得更多的市场份额。如果他们确实适合“开发人员,开发人员,开发人员”,他们将意识到开发人员想要UNIX合规性。
Michael Aaron Safyan 09年

根据我与之紧密合作的人的来信,它可能使事情变得更容易,但对于大多数一次写入,可在任何POSIX上运行的印象来说,这当然是不够的人们听到它是操作系统的“标准”时就会明白。
Hank Gay

6
他们不认为自己“比其他任何人都好”。他们知道自己比别人都。这就是为什么他们会失去市场份额时会改变自己的音调的原因。这对他们来说不是唯一的,例如,当Netscape不再是最流行的标准时,他们开始对Web标准更加关注。

编写仅使用POSIX API的应用程序,可以更轻松地在不同的Unix和类似Unix的操作系统之间进行移植。但是,这是最低的公分母共识标准-因此,特定于操作系统或硬件的实用程序或应用程序通常需要重新编写。
fpmurphy 2011年

2
@Ken,这就是为什么我们不应该让Google的铬变得过于舒适。
Wyatt8740 2015年

29

POSIX是IEEE和The Open Group提出的一组标准,描述了理想的Unix将如何运行。程序员,用户和管理员都可以熟悉POSIX文档,并期望POSIX兼容的Unix提供上述所有标准功能。

由于每个Unix的工作方式都有一些不同-Solaris,Mac OS X,IRIX,BSD和Linux都有其独特之处-POSIX对行业中的人员特别有用,因为它定义了可在其中运行的标准环境。例如, C库中的大多数功能都基于POSIX;因此,程序员可以在自己的应用程序中使用它,并期望它在大多数Unices中表现相同。

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

POSIX的伟大之处在于,欢迎您自己阅读:

开放组基础规范第7期

第7期被称为POSIX.1-2008,其中有很多新事物-但是,用于POSIX.1的Google-fu等将使您看到Unix背后的全部历史。


2
我认为您错误地使用了术语“ UNIX”。UNIX现在指的是Single UNIX规范,任何UNIX操作系统都是符合Single UNIX规范的操作系统。也许您是说类似UNIX?
Michael Aaron Safyan 09年

8
@Michael:考虑到您在其他答案中的评论,您显然是个两极分化的人,其观点并非完全具有建设性。此特定评论非常令人讨厌,无论您选择的标签是否不同,我的意思都得到了传达。此外,Windows在更高版本中符合POSIX。请深呼吸,然后退后一步。
杰德·史密斯,

1
@Jed Smith,除了强烈的意见外,该帖子的含义是某些经认证符合UNIX的操作系统不...因此,我认为可以说这具有误导性。同样,对于Windows,只要存在不兼容的版本,开发人员在瞄准Windows平台时就不能依赖POSIX,从而否定了拥有POSIX的全部目的。
Michael Aaron Safyan 09年

Unix是一个操作系统。UNIX是The Open Group旗下的品牌。经过UNIX95,UNIX98或UNIX03品牌配置文件认证的系统可以使用术语UNIX,该系统符合单一UNIX规范的特定版本构成了大多数品牌要求。
fpmurphy 2011年

6

1985年,来自整个计算机行业的公司的个人共同开发了POSIX(计算机环境的便携式操作系统接口)标准,该标准主要基于UNIX系统V接口定义(SVID)和其他早期的标准化工作。这些努力受到美国政府的鼓励,美国政府需要一个标准的计算环境以最大程度地减少其培训和采购成本。POSIX于1988年发布,是一组IEEE标准,为操作系统定义了API,外壳程序和实用程序接口。尽管这些标准针对的是类似UNIX的系统,但是它们可以应用于任何兼容的操作系统。现在这些标准已被接受,软件开发人员可以开发在所有符合UNIX,Linux,

摘自本书:Linux实用指南


4

Posix更像是一个操作系统,它是“操作系统标准”。您可以将其想象为一个虚构的OS,它实际上并不存在,但是有文档。这些论文是由IEEE定义的“ posix标准”,IEEE是美国的大型标准组织。实现此规范的OS是“符合Posix的”。

政府法规在其投资中倾向于使用符合Posix的解决方案,因此符合Posix的要求具有明显的财务优势,尤其是对于美国的大型IT公司而言。

对于完全兼容posix的OS的回报是,它保证了它将无缝编译和运行所有符合Posix的应用程序。

Linux是最著名的一种。OSX,Solaris,NetBSD和Windows NT也在这里播放。Free和OpenBSD仅“几乎”符合Posix。WinNT的posix-compliance只是避免上述政府法规的伪解决方案。


3

该标准为类Unix操作系统提供了通用基础。它指定了外壳程序的工作方式,ls和grep等命令的预期内容,以及C语言作者可以期望使用的许多C库。

例如,此处详细指定了命令行用户用来将命令串在一起的管道,这意味着C的popen(管道打开)功能是POSIX标准的,而不是ISO C标准的。


3

POSIX代表可移植操作系统接口,并且是旨在促进应用程序可移植性的IEEE标准。POSIX是供应商联盟试图创建UNIX的单个标准版本的尝试。


0

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

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

最受欢迎的示例GNU Bash是100%的POSIX合规性和gawk实用性。


0

Posix控制着互操作性,可移植性,以及其他方面,例如fork的用法和机制,权限和文件系统标准(例如/ etc,/ var,/ usr等)。因此,当开发人员在符合Posix的系统(例如Linux)下编写程序时,通常(并非总是)保证可以在另一个符合posix的系统(例如IBM的AIX系统或Unix的其他商业变体)上运行。Posix是一件好事,因为它可以简化软件开发,以实现其最大的可移植性。希望这个答案有意义。

感谢Jed Smith&Tinkertim指出我的错误-我的糟糕!!!:(


文件系统标准在POSIX之外处理。
杰德·史密斯,

您将POSIX与LSB(Linux标准库)之类的东西混淆了。两种(主要是POSIX兼容)操作系统是FBSD和Linux,但是两者的文件系统组织和默认库安装都大不相同。
蒂姆·波斯特

0

关于如何使操作系统与最新的UNIX操作系统兼容的规范(蓝图)(愿上帝保佑他!)。这就是macOS和GNU / Linux具有非常相似的终端命令行,GUI,库等的原因。因为它们都是根据POSIX蓝图设计的。

POSIX不会告诉工程师和程序员如何编码,而是告诉编码内容。


-1

关于POSIX的一些事实并非如此。

POSIX还是系统调用接口或API,已有30年的历史了。

它设计用于使用具有单个CPU的单台计算机对本地存储进行序列化数据访问

从设计上讲,安全性并不是POSIX的主要关注点,多年来,它导致了众多的竞争条件攻击,并迫使程序员克服这些限制。

仍在发现严重的错误,而更安全的POSIX API设计可以避免这些错误。

POSIX希望用户一次发出一个同步呼叫,并等待其结果后再发出下一个。当今的程序员希望一次发出许多异步请求,以提高整体吞吐量。

对于访问高延迟至关重要的远程和云对象,此同步API尤其不利。


同步内核API不必表示单线程进程和序列化IO。它也与SMP机器无关。这些是完全无关的。(虽然我同意同步内核API不是次优的,但不如您的帖子所显示的那么严重。)
peterh-恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.