it-swarm.cn

POSIX到底是什么?

我看到POSIX到处都有提到,我以为它是UNIX的基本标准。直到我在Wikipedia页面上注意到以下摘录: The Open Group

Open Group作为UNIX商标的认证机构而最为著名,其出版的Single UNIX Specification技术标准扩展了POSIX标准,是UNIX系统的正式定义

如果UNIX系统的正式定义是POSIX的扩展,那么POSIX到底是什么? ,当然,这似乎是UNIX世界的试金石,但我不知道它如何适合整体情况。

144
Peter.O

POSIX首先是1988年的标准,远早于Single UNIX规范。这是统一所有各种UNIX fork和类似UNIX的系统的尝试之一。 POSIX是IEEE标准,但是由于IEEE不拥有UNIX®商标,因此该标准不是UNIX®,尽管它当时基于现有的UNIX API。第一个标准POSIX.1的正式名称为IEEE std 1003.1-1988。[ 1 ] IEEE收取了大量费用才能获得该标准的副本。

开放组织在1997年根据IEEE的POSIX标准工作发布了Single UNIX规范(SUSv2)。 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 [],现在称为The Open Group。然后,他们以UNIXWARE®的身份将UNIX®源代码出售给SCO。[]UNIX®本身已经分叉了多次[ 4 ] [ 5 ]部分是由于AT&T的许可模式所致。购买UNIX®为您提供了操作系统的完整源代码和构建该操作系统的完整工具链。对源代码的修改可以由任何人分发和使用。他从AT&T拥有UNIX®的许可证,许可证费用为数千美元。

BSD是Berkeley的一个项目,该项目对UNIX®操作系统进行了许多增强。 BSD代码是在比AT&T的源代码更为宽松的许可证下发布的,不需要许可证费用,甚至不需要与源代码一起分发,这不同于GPL GNU Project和Linux使用)。这导致BSD代码的很大一部分包含在各种商业UNIX分支中,到4.3BSD左右,它们几乎取代了对原始AT&TUNIX®源代码的任何需要FreeBSD/NetBSD/OpenBSD都是4.3BSD的分支它们是一个完整的操作系统,没有原始的AT&T源代码,也没有UNIX®商标的权利,但是它们的许多代码已由商业UNIX操作系统使用。UNIX上使用的Socket API是在BSD上开发的借用了Unix Fast Filesystem代码,并在各种UNIX操作系统(如Solaris)上使用了它们自己的增强功能。

Linux是1991年开发的,但与BSD不同,它是从头开始开发的,它使用现有的GNU Project),该项目是许多UNIX用户空间的无尘室实现。它实现了许多POSIX兼容性,并且在设计上类似于UNIX,但是它与BSD所具有的与AT&T或UNIX®的联系并不紧密。

130
penguin359

最重要的事情 POSIX 7 定义

  1. C API

    极大 扩展ANSI C 具有以下功能:

    • 更多文件操作:mkdirdirnamesymlinkreadlinklink(硬链接), poll()statsyncnftw()
    • 进程和线程:forkexeclwaitpipe,信号量 _sem_*_ ,共享内存(_shm_*_),kill,调度参数(Nice,_sched_*_),sleepmkfifosetpgid()
    • 联网: socket()
    • 内存管理:mmapmlockmprotectmadvisebrk()
    • 实用程序:正则表达式(_reg*_)

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

    存在许多 Linux系统调用 来实现特定的POSIX C API函数并使Linux兼容,例如_sys_write_,_sys_read_,...但是,其中许多系统调用也具有特定于Linux的扩展名。

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

  2. CLI实用程序

    例如:cdlsecho,...

    许多实用程序都是相应C API函数(例如, mkdir

    主要的Linux桌面实现:GNU小型的Coreutils,单独的GNU大型的项目:sedgrepawk,... ...一些CLI实用程序是由Bash实现的 内置

  3. Shell语言

    例如_a=b; echo "$a"_

    主要的Linux桌面实现: GNU Bash

  4. 环境变量

    例如:HOMEPATH

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

  5. 程序退出状态

    ANSI C用_0_或_EXIT_SUCCESS_表示成功,用_EXIT_FAILURE_表示失败,并保留其余实现。

    POSIX添加:

    • _126_:找到命令,但不能执行。

    • _127_:找不到命令。

    • _> 128_:被信号终止。

      但是POSIX似乎没有指定Bash使用的_128 + SIGNAL_ID_规则: 进程终止时的默认退出代码?

  6. 正则表达式

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

    这些由C API函数实现,并在整个CLI实用程序中使用,例如grep默认接受BRE,并接受带有_-E_的ERE。

    例如:_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._-_

    另请参阅: https://stackoverflow.com/questions/18550253/what-is-posix-compliance-for-filesystem

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

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

    一些广泛使用的约定:

    • _-_表示标准输入文件所在的位置
    • _--_终止标志,例如_ls -- -l_列出名为_-l_的目录

    另请参阅: https://stackoverflow.com/questions/8957222/are-there-standards-for-linux-command-line-switches-and-arguments

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

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

谁符合POSIX?

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

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

认证系统的正式列表可在以下位置找到: https://www.opengroup.org/openbrand/register/ 以及 wiki页面

Windows

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

Android拥有自己的C库(Bionic),截至Android O: https://stackoverflow.com/questions/27604455/is-Android-posix -compatible

奖金等级

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

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

获取HTML页面的完整压缩版本以进行grepping: https://stackoverflow.com/questions/453993/is-there-a-listing-of-the-posix-api-functions/45832939#45832939

POSIX是可移植操作系统标准。它描述了兼容操作系统必须提供给软件的某些实用程序,API和服务(例如套接字,文件I/O和线程),以及有关如何从程序中调用它们的约定。

这个想法是,为一个兼容POSIX的操作系统编写的程序比在不兼容POSIX的操作系统之间移植更容易移植到另一个POSIX操作系统。这就是为什么将应用程序从FreeBSD移植到Linux比将其从FreeBSD移植到Windows要容易得多的原因(尽管Windows表面上支持POSIX的子集。)

16
Andrew Lambert

POSIX是UNIX的一个子集,旨在覆盖其他操作系统的各种类似Unix的环境。这最初包括环境,例如Eunice for VMS,Windows NT的POSIX个性和Apollo Domain/OS。您可以将其视为操作系统服务子集的标准可移植性API,该操作系统服务的行为在Unix和非Unix之间是相同的。有关更多信息,请参见 http://standards.ieee.org/develop/wg/POSIX.html

14
geekosaur