什么是POSIX?我读过Wikipedia article,每次遇到这个词都会读到它。事实是,我从来没有真正理解它是什么。
任何人都可以通过解释“对POSIX的需求”向我解释一下吗?
POSIX代表便携式操作系统接口,是一种旨在促进应用程序可移植性的IEEE标准。 POSIX是供应商联盟创建的单一标准版UNIX的尝试。
POSIX为操作系统或程序定义了一组标准。目标是编写与类UNIX系统兼容的新软件。
例如,在Linux上运行的程序也可以在其他类UNIX系统上编译和运行,如Solaris,HP-UX和AIX等。
最受欢迎的例子是GNU Bash
,它是100%POSIX兼容性和gawk
实用程序。
Posix管理互操作性,可移植性以及其他方面,例如fork的使用和机制,权限 和/ etc,/ var,/ usr等文件系统标准 。因此,当开发人员在符合Posix的系统(例如Linux)下编写程序时,通常(并非总是)保证在另一个符合posix的系统(例如IBM的AIX系统或Unix的其他商业变体)上运行。 Posix是一件好事,因此它可以简化软件开发,以实现最大程度的便携性。希望这个答案有意义。
感谢Jed Smith和Tinkertim指出我的错误 - 我的不好! :(
关于如何使OS与后期UNIX OS兼容的规范(蓝图)(愿上帝保佑他!)。这就是为什么macOS和GNU / Linux具有非常相似的终端命令行,GUI,库等等。因为它们都是根据POSIX蓝图设计的。
POSIX没有告诉工程师和程序员如何编码,而是编码什么。
关于POSIX的一些事实并不那么明亮。
POSIX也是系统调用接口或API,它已有将近30年的历史。
它设计用于使用单CPU的单台计算机对本地存储进行序列化数据访问。
安全性不是POSIX设计中的主要问题,多年来导致众多竞争条件攻击并迫使程序员解决这些限制。
仍然会发现严重的错误,可以通过更安全的POSIX API设计避免错误。
POSIX希望用户一次发出一个同步调用,并在发出下一个调用之前等待其结果。今天的程序员希望一次发出许多异步请求,以提高整体吞吐量。
这种同步API对于访问高延迟很重要的远程和云对象特别糟糕。
POSIX 7定义的最重要的事情
mkdir
,dirname
,symlink
,readlink
,link
(hardlinks),poll()
,stat
,sync
,nftw()
进程和线程:fork
,execl
,pipe
,semaphors sem_*
,共享内存(shm_*
),kill
,调度参数(nice
,sched_*
),sleep
,mkfifo
,setpgid()
网络:socket()
记忆管理:mmap
,mlock
,mprotect
,madvise
,brk()
实用程序:正则表达式(reg*
)
这些API还确定了它们所依赖的基础系统概念,例如, fork
需要一个过程的概念。
存在许多Linux system calls来实现特定的POSIX C API函数并使Linux兼容,例如sys_write
,sys_read
,......其中许多系统调用也有特定于Linux的扩展。
主要的Linux桌面实现:glibc,在很多情况下只是为系统调用提供浅层包装。cd
,ls
,echo
,......
许多实用程序是用于相应C API函数的直接shell前端,例如, mkdir
。
主要的Linux桌面实现:针对小型的GNU Coreutils,针对大型的GNU Coreutils:sed
,grep
,awk
,......一些CLI实用程序由Bash as built-ins实现。a=b; echo "$a"
主要的Linux桌面实现:GNU Bash。HOME
,PATH
。
PATH
search semantics are specified,包括how slashes prevent PATH
search。0
或EXIT_SUCCESS
表示成功,EXIT_FAILURE
表示失败,并保留其余的实现。
POSIX补充说:
126
:发现命令但不可执行。
127
:命令未找到。
> 128
:被信号终止。
但POSIX似乎没有指定Bash使用的128 + SIGNAL_ID
规则:https://unix.stackexchange.com/questions/99112/default-exit-code-when-process-is-terminatedgrep
默认接受BRE,使用-E
接受ERE。
例如:echo 'a.1' | grep -E 'a.[[:digit:]]'
主要的Linux实现:glibc实现了regex.h下的函数,像grep
这样的程序可以用作后端。/dev/null
,/tmp
Linux FHS极大地扩展了POSIX。/
是路径分隔符
NUL
不能使用
.
是cwd
,..
的父母
便携式文件名
最多使用14个字符和256个完整路径
只能包含:a-zA-Z0-9._-
另见:what is posix compliance for filesystem?-a
),没有双连字符长版本(例如--all
)。
一些广泛使用的惯例:
-
表示stdin,其中包含文件
--
终止标志,例如ls -- -l
列出名为-l
的目录
另见:Are there standards for Linux command line switches and arguments?setfacl
的后端。
这个was withdrawn但它是在几个操作系统中实现的,包括in Linux with setxattr
。谁符合POSIX?
许多系统都严格遵循POSIX,但实际上很少有Open Group认证,它保持了标准。值得注意的认证包括:
大多数Linux发行版非常合规,但未经认证,因为他们不想支付合规性检查。 Inspur's K-UX和Huawei's EulerOS是两个经过认证的例子。
官方认证系统清单可在以下网址找到:https://www.opengroup.org/openbrand/register/和wiki page。
视窗
Windows在其某些专业发行版上实现了POSIX。
由于它是一个可选功能,程序员不能依赖它来支持大多数最终用户应用程序。
Windows 8中不支持支持:
2016年,宣布了一个名为“Linux子系统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之上添加了更多功能。
Android的
Android拥有自己的C库(Bionic),从Android O:Is Android POSIX-compatible?开始,它不完全支持POSIX
奖金水平
Linux Standard Base进一步扩展了POSIX。
使用非帧索引,它们更易读和可搜索:http://pubs.opengroup.org/onlinepubs/9699919799/nfindex.html
获取HTML页面的完整压缩版本以进行grepping:Where is the list of the POSIX C API functions?
让我给出粗略的“非正式”解释。
POSIX是一组标准,它试图将“UNIX”和类UNIX系统与那些与它们不兼容的系统区分开来。它是由美国政府为采购目的而创建的。其想法是,美国联邦采购需要一种方法来合法地指定各种投标和合同的要求,其方式可以用于排除给定现有代码库或编程人员不可移植的系统。
由于POSIX是事后编写的......用于描述一组松散相似的竞争系统......它不是以可以实现的方式编写的。
因此,例如,Microsoft的NT编写时具有足够的POSIX一致性以符合某些出价......即使POSIX子系统在实际可移植性和与UNIX系统的兼容性方面基本上没用。
几十年来,已经编写了各种其他UNIX标准。诸如SPEC1170(指定了必须兼容的一百一十七个函数调用)和SUS(单一UNIX规范)的各种版本之类的东西。
在大多数情况下,这些“标准”不适用于任何实际的技术应用。它们最常用于论证,法律争论和其他功能失调的原因。
POSIX是IEEE和The Open Group提出的一套标准,描述了理想的Unix如何运作。程序员,用户和管理员都可以熟悉POSIX文档,并期望POSIX投诉Unix提供所有提到的标准工具。
由于每个Unix的工作方式都有所不同 - Solaris,Mac OS X,IRIX,BSD和Linux都有它们的怪癖 - POSIX对业界人士特别有用,因为它定义了一个标准的操作环境。例如, C库中的大多数功能都基于POSIX;因此,程序员可以在他的应用程序中使用一个程序员,并期望它在大多数Unices中表现相同。
然而,Unix的不同领域通常是焦点,而不是标准的。
关于POSIX的好处是欢迎您自己阅读:
问题7被称为POSIX.1-2008,并且有新的东西 - 但是,用于POSIX.1的Google-fu等可以让你看到Unix背后的整个历史。
POSIX是操作系统的标准,应该可以更容易地编写跨平台软件。这在Unix世界中是一个特别重要的事情。
1985年,来自整个计算机行业公司的个人联合起来开发了POSIX(计算机环境的可移植操作系统接口)标准,该标准主要基于UNIX System V接口定义(SVID)和其他早期的标准化工作。这些努力是由美国政府推动的,美国政府需要一个标准的计算环境来尽量减少其培训和采购成本。 POSIX于1988年发布,是一组IEEE标准,用于定义操作系统的API,shell和实用程序接口。虽然针对类UNIX系统,但标准可适用于任何兼容的操作系统。现在这些标准已经获得认可,软件开发人员能够开发在所有符合UNIX,Linux和其他操作系统版本上运行的应用程序。
从书中:Linux的实用指南
该标准为类Unix操作系统提供了通用基础。它指定了shell应该如何工作,对ls和grep等命令的期望,以及C作者可以期望的许多C库。
例如,命令行用户用来串联命令的管道在这里详细说明,这意味着C的popen(管道打开)功能是POSIX标准,而不是ISO C标准。
Posix更像是一个操作系统,它是一个“操作系统标准”。您可以将它想象成一个虚构的操作系统,它实际上不存在,但它有一个文档。这些论文是由IEEE定义的“posix标准”,IEEE是美国的标准组织。实现此规范的操作系统是“Posix兼容的”。
政府法规在其投资中更喜欢符合Posix标准的解决方案,因此符合Posix标准具有显着的财务优势,特别是对于美国的大型IT公司而言。
对完全符合posix标准的操作系统的奖励,它保证它将无缝地编译和运行所有符合Posix的应用程序。
Linux是最知名的。 OSX,Solaris,NetBSD和Windows NT也在这里播放。 Free-和OpenBSD只是“几乎”与Posix兼容。 WinNT的posix兼容性只是避免上述政府监管的伪解决方案。