Linux开发者越来越多,但是仍然有很多人不明白什么是POSIX。本文将带你了解什么是POSIX,它的历史和重要性。1.什么是posix?1.概念POSIX:PortableOperatingSystemInterfaceofUNIX(简称POSIX),2.出版者——IEEE出版者是美国电气电子工程师学会(InstituteofElectricalandElectronicsEngineers),简称IEEE。这个协会老牌了【该组织是航天、计算机、电信、生物医药、电力和消费电子领域的主要权威机构】!POSIX是IEEE对在各种UNIX操作系统上运行的软件的指定。定义的一系列API标准的总称,其正式名称为IEEE1003,国际标准名称为ISO/IEC9945。POSIX.1已被国际标准组织(ISO)接受并命名为ISO/IEC9945-1:1990标准。IEEE,总部设在美国纽约,是国际电子技术和信息科学工程师协会,是目前世界上最大的非营利性专业技术协会。IEEE致力于电气、电子、计算机工程和科学相关领域的开发和研究。在航天、计算机、电信、生物医药、电力和消费电子等领域制定了1300多项行业标准,现已发展成为具有较大影响力的国际学术组织3.POSIX标准下载主页:http://blog。csdn.net/ablo_zhou很多人都听说过POSIX标准,但是不清楚这个标准长什么样,从哪里下载的。清除。现开放给相关人士使用。SingleUNIXSpecificationV3,IEEEStd1003.1,2004Edition标准在线地址:http://www.unix.org/version3/online.html注册后即可在线阅读或下载。IEEE和OpenGroup的POSIX认证:http://www.opengroup.org/certification/idx/posix.html相关页面:http://www.unix.org/version3/ieee_std.html二、POSIX的历史1.起源POSIX是Unix的标准。1974年,贝尔实验室正式发布了Unix。由于反垄断的种种原因,以及早期Unix的不完善,贝尔实验室慷慨地将源代码提供给学校,因此Unix得到了高校的大量支持并不断发展。于是,出现了很多自主开发的与Unix基本兼容但不完全兼容的操作系统,俗称类Unix操作系统。包括:加州大学伯克利分校的Unix4.xBSD(BerkeleySoftwareDistribution)。贝尔实验室发布了自己的版本,称为SystemVUnix。其他供应商的版本,例如SunMicrosystems的Solaris系统,都是从这些原始的BSD和SystemV版本衍生而来的。在20世纪80年代中期,Unix供应商试图通过添加新的、通常不兼容的功能来区分他们的程序。场面混乱,麻烦接踵而至。为了提高应用程序的兼容性和可移植性并阻止这种趋势,IEEE(电气和电子工程师协会)开始努力规范Unix的开发,后来被RichardStallman命名为“Posix”。这套标准涵盖了很多方面,如Unix系统调用的C语言接口、shell程序和工具、线程和网络编程等。2.谁遵循这个标准?首先是大名鼎鼎的Unix和Linux。此外,Apple的操作系统也是基于Unix的。有了这个规范,就可以调用常用的API,Linux提供的POSIX系统调用也可以在Unix上执行,所以学习Linux底层接口的最好方法就是了解POSIX标准。Windows从WinNT开始就与POSIX兼容。这是因为Unix在要求苛刻的领域比Windows具有更高的地位。为了将Unix用户拉入Windows阵营,被迫支持POSIX。现在Win10对Linux/POSIX的支持很好,因为Linux已经占据了廉价服务器市场。为了提高Windows的竞争力。所以一切以市场为导向。三、支持POSIX-Linux成功的最重要因素Linux的成功因素有很多,但支持POSIX标准无疑是其快速发展的最重要因素。POSIX标准制定的最终投票阶段大概是在1991年到1993年之间。此时,在Linux刚刚起步的时候,这个UNIX标准为Linux提供了极其重要的信息,使得Linux能够在标准的指导下发展,与大多数UNIX操作系统兼容。在最初的Linux内核源代码中(0.01版、0.11版),已经为Linux系统与POSIX标准的兼容做了准备。Linux0.01版本的kernel/include/unistd.h文件中已经定义了POSIX标准需要的几个符号常量,Linus在评论中写道:“好吧,这可能是个玩笑,但我正在努力Woolen布”。正是因为Linux支持POSIX标准,无数可以在Unix上运行的程序相继移植到Linux上。而此时,由于版权问题,Unix已经卷入官司,使得Linux后来居上。时间就是命运!以下是申请POSIX标准的爷爷Linus的邮件:发件人:torvalds@klaava.Helsinki.Fi(LinusTorvalds)讨论组:comp.os.minix主题:Gcc-1.40andaIssueinformationaboutPOSIX名称:1991Jul3,100050.9886@klaava.Helsinki.Fi日期:1991年7月3日,10:00:50GMT大家好!由于本人在MINIX系统下做项目,所以对POSIX标准很感兴趣。谁能以(最好)机器可读的形式向我提供最新的POSIX规则?有一个FTP地址就更好了。而Linus也在《只是为了好玩》中谈到了POSIX的重要性:POSIX标准是一套冗长的规则,可以应用于数百种UNIX系统调用中的任何一种。计算机需要执行的任务(从读、写、启动和关机开始)都需要这个标准。POSIX指的是一个UNIX标准系统,或者说是一个由不同公司的代表组成的组织,希望按照一个共同的标准来运作。标准对于程序员在操作系统下开发新的应用软件或开发新版本的应用软件是极其重要的。从像POSIX这样的系统调用(systemcalls),特别是重要的调用(calls),我可以得到一个操作系统应该具备哪些功能的列表;然后我就可以在我自己的系统中以我自己的方式实现每一个功能。通过编写这些标准,我的系统软件的源代码将被其他人用来开发新的应用软件。我当时并不知道我可以直接从POSIX公司购买带有这些规则的软盘,但这没关系。即使我负担得起,把东西运到芬兰也常常需要很长时间。我不想等那么久,所以我四处寻找可以直接从FTP地址下载的版本。没有人给我可以找到POSI标准的来源。于是我开始了B计划。我从学校找到了sun服务器(sunserver)的sunmicrosystems版本的UNIX手册。手册中有一个完全可行的系统调用的基本版本。从用户手册中可以看到系统调用的主要功能以及完成这些功能需要完成的步骤。不过从中看不出具体的方法,只是说明了最终的结果。所以我开始从AndrewTanenbaum的书和其他来源收集一些系统调用。最终有人寄给我那些厚厚的POSIX标准。3.可移植性说到POSIX,就不得不说什么是可移植性。在谈移植性之前,我们先了解一下库函数和系统调用的区别。Linux下操作文件有两种方式:系统调用(systemcall)和库函数调用(Libraryfunctions)。1、系统调用系统调用是操作系统本身的接口,是面向底层硬件的。通过系统调用,运行在用户态的进程可以与硬件设备(如CPU、磁盘、打印机等)进行交互,是操作系统留给应用程序的接口。2.库函数库函数(Libraryfunction)是将函数放在库中供他人使用的一种方式。方法是将一些常用的函数编译成一个文件,供不同的人调用。一般放在.lib文件中。库函数调用是面向应用程序开发的,库函数可以分为两类,一类是C语言标准规定的库函数,一类是编译器特有的库函数。(由于版权原因,库函数的源代码一般是看不到的,但是可以在头文件中看到它的对外接口)。glibc是Linux下使用的开源标准C库。它是GNU发布的libc库,即运行时库。这些基本功能是标准化的,这些功能通常直接用汇编实现。glibc为程序员提供了丰富的API(ApplicationProgrammingInterface),这些API遵循POSIX标准,API的函数名、返回值、参数类型等必须按照POSIX标准定义。POSIX兼容性也规定了这些接口函数是兼容的,但是API是如何实现的并不重要。3、库函数API和系统调用的区别如上图所示:(1)库函数是语言或应用程序的一部分,系统调用是内核提供给应用程序的接口,是一部分(2)库函数在用户地址空间执行,系统调用在内核地址空间执行,库函数的运行时间属于用户时间,系统调用属于系统时间,库函数的开销小,系统调用的开销大(3)系统调用依赖于平台,库函数不依赖系统调用是为了方便使用操作的接口系统,而库函数是为了方便人们编程。库函数调用与系统无关。不同的系统调用库函数,库函数会调用不同的底层函数实现,移植性好。4.程序可移植性及其本质那么目标代码和启动代码是如何生成的呢?答案是编译器。用编程语言编写的程序,首先要经过编译器编译成目标代码(0、1代码),然后在目标代码前面插入启动代码,最终生成一个完整的程序。需要注意的是,程序中专门为访问特定设备(如监视器)或操作系统(如windowsxp的API)的特殊功能而编写的部分通常是不可移植的。综上所述,一门编程语言的可移植性取决于不同平台的编译器的数量对特殊硬件或操作系统的依赖移植是基于操作系统的。但此时需要注意一点:基于不同的操作系统平台,应用程序不能直接在二级系统层面进行移植。我们只能在代码层面考虑可移植性。在API层面,由于各个操作系统的命名约定和系统调用,无法实现API层面的可移植性。在各个平台下,我们默认C标准库中的函数都是一样的,这样基本可以做到可移植性。但是对于C库本身来说,其内部实现在各种操作系统平台下是完全不同的,也就是说C库封装了操作系统API的内部实现细节。因此,C语言为我们提供了代码层面的可移植性,即这种可移植性是通过C语言的中间层来完成的。就像处理我们的代码一样。下面的代码可以帮助我们实现平台间的移植:#ifdef_WINDOWS_CreateThread();//windows下线程的创建#elsePthread_create();//Linux下线程的创建#endif对于头文件,同样使用预编译宏来实现。如:#ifndef_WINDOWS_#include
