“POSIX”是什么意思?

新手上路,请多包涵

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

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

原文由 claws 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

POSIXIEEE 指定的一系列标准,用于阐明和统一 Unix-y 操作系统提供的应用程序编程接口(以及辅助问题,例如命令行 shell 实用程序)。

当您编写依赖于 POSIX 标准的程序时,您可以很肯定地能够轻松地将它们移植到一大类 Unix 衍生产品(包括 Linux,但不限于它!);如果并且当您使用一些未作为 Posix 的一部分标准化的 Linux API 时,如果您希望将来将该程序或库移植到其他 Unix-y 系统(例如 MacOSX),您将遇到困难。

原文由 Alex Martelli 发布,翻译遵循 CC BY-SA 4.0 许可协议

POSIX 7 定义的最重要的事情

  1. C API

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

    • more file operations: mkdir , dirname , symlink , readlink , link (hardlinks), poll() , stat , sync , nftw()
    • process and threads: fork , execl , wait , pipe , semaphors sem_* , shared memory ( shm_* ), kill , scheduling parameters ( nice , sched_* ), sleep , mkfifo , setpgid()
    • 网络: socket()
    • memory management: mmap , mlock , mprotect , madvise , brk()
    • 实用程序:正则表达式( reg*

这些 API 还确定了它们所依赖的底层系统概念,例如 fork 需要一个进程的概念。

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

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

  1. CLI 实用程序

    例如: cd , ls , echo , …

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

    主要的 Linux 桌面实现:小型的 GNU Coreutils,大型的单独 GNU 项目: sedgrepawk ,…由 Bash 实现 为 built-ins

  2. 外壳语言

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

    主要的 Linux 桌面实现: GNU Bash

  3. 环境变量

    例如: HOMEPATH

    PATH 指定搜索语义,包括 斜线如何防止 PATH 搜索

  4. 程序退出状态

    ANSI C 表示 0EXIT_SUCCESS 表示成功, EXIT_FAILURE 表示失败,并保留定义的其余实现。

    POSIX 补充说:

    • 126 :找到命令但不可执行。

    • 127 :找不到命令。

    • > 128 :由信号终止。

    但是POSIX似乎没有指定Bash使用的 128 + SIGNAL_ID 规则: https ://unix.stackexchange.com/questions/99112/default-exit-code-when-process-is-terminated

另见: shell脚本中 $? (美元问号)的含义是什么?

  1. 正则表达式

    有两种类型:BRE(基本)和 ERE(扩展)。 Basic 已弃用,仅保留不破坏 API。

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

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

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

  2. 目录结构

    例如: /dev/null/tmp

    Linux FHS 极大地扩展了 POSIX。

  3. 文件名

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

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

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

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

    一些广泛使用的约定:

    • - 表示预期文件的标准输入
    • -- 终止标志,例如 ls -- -l 列出一个名为 -l

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

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

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

谁符合 POSIX?

许多系统都严格遵循 POSIX,但实际上很少有系统得到维护该标准的 Open Group 的认证。著名的认证包括:

  • OS X (Apple) X 代表 10 和 UNIX。大约是 2001 年发布的第一个 Apple POSIX 系统。另请参阅: OSX 是 POSIX 操作系统吗?
  • AIX (IBM)
  • HP-UX(惠普)
  • 索拉里斯(甲骨文)

大多数 Linux 发行版都非常合规,但没有经过认证,因为他们不想支付合规检查。 浪潮的 K-UX华为的 EulerOS 就是两个经过认证的例子。

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

视窗

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

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

Windows 8 中已弃用支持:

2016 年,宣布了一个名为“Windows Subsystem for 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 API 功能”,但要求您“如果您希望它在 Windows 上运行,则从源代码重新构建您的应用程序”。 MSYS2 是一个相关项目,似乎在 Cygwin 之上添加了更多功能。

如果您需要的 POSIX 中唯一的东西是命令行实用程序,还请考虑: https ://github.com/shelljs/shelljs 它在 Node.js 中重新实现了一堆 CLI 实用程序,它已经基本上实现了可移植性层对于更简单的系统调用,如 mkdir 等。许多人在他们的项目的 package.json 中使用该项目,以允许在 Windows 上运行该项目。当然,它需要用户安装 Node.js 运行时,但鉴于 Node.js 的流行,我不认为它会很快崩溃/难以满足。

安卓

Android 有自己的 C 库(仿生),从 Android O 开始不完全支持 POSIX: Android POSIX 兼容吗?

奖金等级

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

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

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

原文由 Ciro Santilli OurBigBook.com 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题