集中认识Unix, BSD, SUS, LSB以及 POSIX 各种理论东西.
简介
我曾经在学习系统编程的时候,发现各种不同的调用时,总是要涉及标准(man page),
当时其实是不在意的,因为不知道有啥区别, 打个比方:man wait
1 | NAME |
上面的 200809L
就是指的一个标准。
详解
Posix
POSIX,即Portable Operating System Interface,可移植操作系统接口。IEEE最初开发POSIX标准,是为了提高UNIX环境下应用程序的可移植性。然而POSIX并不局限于UNIX。许多其它操作系统,例如DEC OpenVMS和Microsoft Windows NT都支持POSIX标准。
POSIX现在已经发展成为一个非常庞大的标准族,某些部分正处于开发过程中。POSIX定义了一个接口,而非一种实现,所以并不区分系统调用和库函数。标准中所有的例程都是宏和函数。POSIX接口连接了OS和应用程序。符合POSIX接口的OS和应用程序可以无缝交流。
Linux基本逐步上实现了POSIX兼容,但并没有参加正式的POSIX认证。如Linux的线程实现版本和POSIX标准之间还是存在着细微的差别,最明显的是关于信号处理部分。微软的Windows NT至少部分实现了POSIX兼容。
(下面只谈论Posix1.
而不谈论Posix2.
,因为用的少)
SUSv3,Berkerly,BSD
200809L就是指的一个标准,一般是指SUSv4或者POSIX.1-2008 (可以理解成同一标准的两种称谓)。
一般系统编程(或者在Linux下进行开发),为了兼容不同的Linux或者Unix系统,就要看看这些标准;个人把SUSv3或者POSIX.1-2001视为主流标准(遵循这个标准的函数/系统调用封装函数,一般可以随便用而不用担心兼容性问题, 因为类nix系统一般遵循POSIX标准)
不管类nix中有都多少名称,例如BSD啊,Berkerly啊,抓住POSIX标准就可以了。因为平台太多,没精力逐个对付啊;看下boost是怎么在定义的平台:
补充,你看看CPP这些宏是怎么定义的,来看一下Boost怎么定义的
LSB
Linux Standard Base,为什么会有一个Linux标准?
因为Linux本质上和Unix相同,但是发展到后面也是存在差别的,特别是Linux会有自己的许多方便的定义。
(包括像系统调用,不同系统提供的系统调用服务例程或者实现方式不一样)
但是,你可以把LSB看做是POSIX和SUS的超集(父集),就像Linux的IPC通信,既借鉴了System V
的“Shared Memory”, “Semaphore”, “Message Queues”, 又借鉴了Berkerly
的“Signals, Pipes”。
需要了解更多么?谁知道呢?
参考
- 《Unix/Linux系统编程手册(上册)》 chapter 1
总结
这是我在Linux系统编程时曾经遇到的问题,个人因为觉得烦不过,就草草的翻看了一下理论;
总的来说,你不用去看wiki了,核心的遵循一下POSIX1.2001或者比较新的POSIX1.2008即可