本文4300余字,阅读约11分钟,本文知乎链接:Cygwin系列(一):Cygwin是什么。
本文接上篇Cygwin前传:从割据到互补。先一句话回答标题:Cygwin是一个可原生运行于Windows系统上的POSXI兼容环境。
计算机世界里存在各种各样的操作系统,目前通用操作系统有主流的三大类:
这些系统有各自的内核,出于系统稳定性考虑是不允许用户程序直接操作内核,同时也将内核开发和应用软件开发隔离开来,系统将必要的函数封装成库供应用软件调用,约定的规范即为应用软件接口(Application Program Interface,API)。
软件系统层级关系简要示意图
API函数库是连接用户软件和系统内核桥梁,或者是“协议”,操作系统厂商写好函数库说明书,应用软件开发者不必关心其内部是如何实现的,用的时候对照着API手册查询就够了;应用软件也可以越过系统函数库通过system call(系统调用)直接调用os内核函数,如图中红色虚线所示,当然这种方式并不被推荐。
如果各系统平台都能提供相同的系统函数库,那么开发者在这个系统函数库基础之上编写软件代码,那么就很容易将软件移植到各个系统平台。然而,这只是个美好的愿望,IEEE就是为了达成这样的愿望才牵头制定POSIX标准。POSIX标准主要就是针对UNIX API而制订,不管函数如何包装、功能如何实现,但API按照标准约定来(比如函数变量等符号名称、数据结构、参数类型与个数、基本工具命令名称等),Linux完全兼容POSIX标准(部分函数符合POSIX,部分函数是Linux专有,即是POSIX的超集),微软声称Windows部分兼容POSIX标准。
主流os内核通常是C语言写成,系统函数库通常以一个或多个链接库文件的形式提供,其中最重要的是C标准库,其他的链接库往往调用C标准库而实现,当然也可能直接调用系统内核函数,甚至混合。不同系统平台有多种主流的C标准库共存:
先辈David Wheeler大神曾经曰过:
“All problems in computer science can be solved by another level of indirection(计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决)”。
David Wheeler ( 图片来源:https://en.wikipedia.org/wiki/David_Wheeler_(computer_scientist) )
就如同上图,在硬件基础之上逐步堆叠了系统内核、系统函数库等中间层,在应用程序内部还可以继续细分多个层次,这样把最终用户与硬件隔离开来,增强了抽象能力、屏蔽底层细节,也让开发者分工,专注于各自层次的开发,同时降低了软件迁移的难度。
Cygwin就是在Windows中增加了一个中间层——兼容POSIX的模拟层,并在此基础上构建了大量Linux-like的软件工具。再来解释本文开头的回答,如下图,POSXI兼容环境包括以下两部分:
*注:Cygwin的libc是Newlib,Linux的libc是GNU libc,UNIX有的是BSD libc。
Cygwin环境层次简要示意图
Cygwin API首先尽可能地遵从Single Unix Specification V3(2018版),这个标准内容同时也是POSIX.1和IEEE Std 1003.1的标准内容,由Open Group和IEEE共同制定,最新已更新到V4(2018版),其次再尽可能地遵从Linux最佳实践。Cygwin API中还有些是Cygwin独有的,在POSIX中并未涉及。
Cygwin将cygwin1.dll、函数库、应用程序等文件按照UNIX/Linux的目录树架构进行组织存放,如/bin、/usr、/lib、/etc、/var、/home等等都存在于Cygwin安装路径下,用户从终端登陆进Cygwin的shell后,就可以像在UNIX/Linux系统那样使用相同的命令、工具,随着开发工作推进,越来越多的GNU、UNIX、Linux软件都移植到了Cygwin中。不仅如此,甚至像X Server、Gnome/KDE桌面环境等都移植到了Cygwin中,UNIX/Linux系统中的图形界面软件也能使用。
Cygwin的优点
Cygwin可资利用的是已经移植的大量GNU、UNIX、Linux软件和兼容POSIX的模拟层,其使用场合也就是针对这两点。
高效命令行工具 (图片来源于网络)
常见的应用场合包括但不限于:
(1)Shell命令行使用
Shell是UNIX/Linux的精华所在,骨灰级玩家可以做到不用鼠标只敲命令完成所有工作,用户最常用的大量命令在Cygwin下均可照常使用,在UNIX/Linux编写的脚本也可以几乎不加修改地在Cygwin下运行。例如安卓厨房本是在Linux-like环境下运行的脚本集合,用于修改安卓系统固件包,有了Cygwin,Windows用户也可以拿来修改安卓系统固件包。高效的命令行工具与Windows图形界面各有所长、形成互补。
(2)交叉编译构建环境搭建
Cygwin环境中已移植好了gcc等开发工具,大量的交叉工具链(如arm-none-gnu-eabi-gcc、arm-none-gnu-eabi-binutils)也可以在Cygwin中制作,就算只有Windows原生版本的,Cygwin shell中也能调用,那么利用Cygwin就能搭建起交叉编译构建环境;另外,使用Cygwin API,编写代码以及后续编译构建过程,与在UNIX/Linux中差异也很小了。
(3)程序移植
把符合POSIX标准的程序移植到Windows下,还有更多正在由个人、社区、商业公司、研究机构不断贡献的开源自由软件,造福广大Windows用户,利用已有的GNU、UNIX、Linux软件会使程序移植越来越容易。这一点不多说。
(4)兼用POSIX API和Win32 API开发
有的开发者可能对UNIX/Linux和Win32的API都熟悉,两套API也各有其优点,在Cygwin下开发者自己可以任意选取、混合使用。