其实Unix很简单

系统 1638 0

其实 Unix 很简单

 

陈皓

 

很多编程的朋友都在网上问我这样的几个问题, Unix 怎么学? Unix 怎么这么难?如何才能学好?并且让我给他们一些学好 Unix 的经验。在绝大多数时候,我发现问这些问题的朋友都有两个特点:

1 )对 Unix 有畏难心理,对其没有信心;

2 )喜欢用拿 Windows 来和 Unix 做比较。

 

这两种特点就像两个“心理暗示”,暗示着自己 Unix 很不好学,暗示着 Unix 很糟糕,不如 Windows 好。于是,自己也就被自己的这种长期的“暗示”所催眠了。因为,从一开始就有畏难情绪,所以也就觉得 Unix 不好,觉得非常很吃力,最后还会导致对 Unix 的厌恶和反感的情绪。所以,为了纠正上述朋友们的“心理暗示”。我想写下这篇文章, 想告诉大家, Unix 真的很简单。

 

在正式叙述“简单的 Unix ”之前,我想做几点说明:(以免陷入无意义的争论)

 

1)   本文是站在开发者的角度来说明的,所以,如果有朋友不同意我的观点,请也以开发者的角度来向我提出质问和讨论,本人非常欢迎。

 

2)   本文难免要用 Windows 来和 Unix 做对比。这并不代表我不喜欢 Windows ,也不代表我要叫你放弃 Windows 。我们也知道这种对比已经没有什么意思了,但因为众多的朋友被 Windows 先入为主了,所以,我一定要拿 Windows 来开刀,才能扭转那个“心理暗示”。仅此而已。

 

 

       OK ,言归正传。先说 Unix 的一个最重要的特点——“高内聚,低藕合”!也就是说, Unix 下的各种应用程序都和别人不相干。这就是贯穿整个 Unix 的思维——模块和程序的高度独立性。这样的设计和做法,会让你的系统比较的稳定,也会让你的系统特别地容易管理和维护。 Unix 下的应用程序们就像一支正规军一样排列地整整齐齐,只要司令(内核)还在,系统是不会因为某个军队的损失而无法自举的。而 Windows 的应用程序们就像一片树林一样,从地表上看过去,树木们排列地整整齐齐,但是他们的树根在地下却相互缠绕在一起,剪不断,理还乱,异常地复杂。

 

       “高内聚,低藕合”的给 Unix 造成的结果是,其系统中基本上都是功能单一的小程序,这些小程序就像积木一样,当我们需要构造建一个自定义的建筑时,大多数情况下,我们只需要做的只是一个“搭积木”的简单游戏。 Windows 建设得富丽堂皇,可惜,别人的“积木”你几乎不可能拿到自己的建筑中来。总是要你模仿或重写。

 

插一句: 你是否注意到在网上下载 Windows 的软件时,会有一种所谓的“绿色软件”?这就是对 Windows 的最大讽刺, Windows 下装一个软件, N DLL 放到 Windows 系统目录下,注册表里写入 N 个键值,还有很多你不知道的动作。而在 Unix 装软件,你不用担心你的系统目录下会莫明其妙地多出些乱七八糟的文件。就是 copy 那么简单,那怕是 rpm 自动安装,安装完后,你也能够查询到软件安装后对系统所做的改变。所以,你在 Unix 下分发你的软件时,你会觉得比 Windows 下要做得简单了许多许多。)

 

       再说说 Unix 的另一个最重要的特点——“所有的设备都可以像文件一样地操作”。简单吧。所有的调备,文件、打印机、显示器、终端、网络、软盘、磁带、 USB CDROM 、等等的 I/O 操作,都以文件描述符的方式进行操作。两个 Unix 下最重要的系统调用 read/write 就可以胜任所有设备的 I/O 了。 Unix 早就在 /dev 目录下为你建好了这些文件。使用起来很简单。

 

       也许很多人都觉得 Unix 的命令行太过复杂。一个命令有着若干的参数,异常地复杂。但之所以今天 Unix 下的应用程序还在以字符界面为主,这恰好体现了 Unix 的简单的特征。这也是 Unix 的另一个特点——“命令的相互支持性”,命令们通过一个管道或是重定向,可以互相联系在一起,再加以 Shell 脚本的支持,哪怕要实现一些复杂的功能(比如一个小型的文本数据库),也是简单之极。

 

       如果上面的论述依然不能让你信服 Unix 很简单,那么,让我们来用一些具体地实际的例子来看一下, Unix 是如何简单的。让我们试着做下面的这样一个假设:“如果我们在学习编程的时候一开始是学 Unix ,然后转去做 Windows ”,那会是怎么样的一个情况?

 

1)   我们在 Unix 下创建进程,使用 fork 调用。到了 Windows 下,我们查了 MSDN ,发现了一个叫 CreateProcess 的系统调用可以创建进程,但我们却发现这个系统调用有 10 个参数。而 Unix 下的 fork 却一个参数都没有。这种情况下,你是否会有一种头大的感觉?因为,在 Unix 下,你根本看不到会有 10 参数这样复杂的系统调用 API

 

2)   我们在 Unix 下操作文件权限很简单,文件权限分三组(本人,同组,别人),每组都是可读,可写,可执行。两个简单的系统调用 chmod/chown 就搞定。到了 Windows 下,如果是 NTFS ,如果要以程序的方式设置文件权限,呵呵,你需要先了解什么是: SID ,什么是 DACL ,什么是 SACL ,什么是 ACE ,还有十几相关的系统 API 函数等着你。(参看我的《 以程序操作 NTFS 文件权限 》)你也许会觉得这么复杂的安全策略是让系统更安全的基础,可以自从 Windows 出现的那一天以后,在安全方面的表现就没有胜过 Unix 。这无疑让人感到 Windows 做了一件吃力不讨好的事。

 

插一句 Unix 下的用户切换是相当简易方便的。而 Windows 下的用户切换会导致你需要退出当前用户的前台程序。这导致了 Windows 下的用户几乎无一例外地都会选择在超级用户的权限下工作 / 上网,这完全是让自己的机器在裸奔,所以, Windows 下的病毒一旦在系统中运行就为所欲为了。而 Unix 下,很少用户会以 root 身份操作本机,因为切换用户非常方便。

 

3)   Unix 下,用户有 ID ,用户组有 ID ,进程 / 线程都有 ID ID 很简单易懂,就像我们的身份证一样。到了 Windows 下,用户标识叫 Token ,进程标识叫 Handle (其实也就是一个 DWORD 的类型),我看到网上很多问题都在问 Windows 下的 Handle 的概念问题。我一直在想,为什么微软不取一个简单易懂的术语?要取得那么抽象,那么让人很迷惑。虽然这让 Windows 看起很 NB ,但也会因此加大了学习复杂度。( Windows 的开发学习复杂度要比 Unix 复杂多了,而且有太多的看似很高深的术语让人一头雾水)

 

4)   让我们再来看一下用户管理和程序所有者方面的东西。在 Unix 下,需要你做的是配置 NIS 服务器和 NFS 服务器(以 Autofs 自动 mount ),简洁,清楚。到了 Windows 下,与其相似的是一个叫 Domain 的东西(主域控制器),首先,为了加入域,你需要重启电脑( Unix 下只需要配置 /etc/nsswitch.conf 文件来告诉本机的用户登录源,无需重启),而对开发者来说, Unix 的这个配置对程序是完全透明的。而 Windows 的域用户和本地用户需要一个域名来区分。在程序中切换用户时, Unix 只需要 setuid/seteuid 就行了, Windows 对此有三个比较复杂的 API CreateProcessAsUser, ImpersonateLoggedOnUser, LogonUser ,其复杂度就不用比较了。另外,在 Domain 方式下,你的 Document and Setting 目录下的文件,会全部放到 Domain 服务器上去,你在别的机器上登录时,需要下载这些文件。最后,我倒不担心你和网友的 MSN 聊天记录会因为你的登录而到处都是,我担心的是,你在这么复杂的管理环境中写出来的代码是否能让别人放心? :-(

 

5)   Unix 下,要把自己的程序加入系统的启动服务只需要在 /etc/init.d 中配置就行了。写下一个有启动停止功能脚本,以特殊命名的方式链接到不同启动模式目录下就行了。 Windows 下加一个启动服务,如果你不编写程序,估计比较困难。

 

6)   Unix 下,如果要取得系统的信息。只需要到 /proc 目录下去 cat 那堆文件。所有进 / 线程的状态、命令行、内存 / 交换区使用情况、打开的文件描述符,等等,系统的 CPU ,内存,交换区,内存文件 IO ,分区,信息,网络,系统运行状态,系统设备,等等,要有多详细就有多详细,而且完全是纯文本的,直接就可以看了。到了 Windows 下,要穷举系统当前进程的信息,就不是一样很容易的事,更别说要取得别的信息了。

 

 

我很佩服微软把操作系统搞得那么复杂,又是注册表,又是安全策略,又是 OLE ,又是 COM ……。每次打开 regedit.exe 时,我根本不敢碰 HKEY_CLASSES_ROOT ,因为我看着里面那些成千上万个 CLSID ,我有点晕菜。

 

1995 年以来, 10 来年过去了。微软推出了多种各式各样的技术。我还记得 Visual Studio 6.0 中还有两个叫做 FoxPro J++ 的东西, FoxPro 来自 Foxbase ,还有个几年, J++ 好像就没有几年。 ActiveX Control 完全是一个失败的技术,而那个叫做 VB 的编程语言,今天看来,它的确毁了很多很有潜力的程序员。在 COM 出现的时候,不知道今天还有多少人还记得一个叫 MTS 的玩意?今天,不知道还有多少人记得有一个叫 ODBC 的东西?在这种复杂混乱的 Windows 世界中,是否让你疲于追赶?今天的 .NET 不知道又有多少技术会随着时间所沉淀?在 Windows 上面,我们学习了许多的失败技术或是说是过渡技术。而我们的 Unix 自从上纪 70 年代以来,就没有多大的变化,而因为 Unix 应运而生的 C 语言直到今天依然光彩夺目。我相信这个 30 多年来久经考验还那么简单的 Unix

 

Unix 就是这么简单,各位想在 Unix 下学开发的朋友, Windows 那么复杂的操作系统都过来了,你还会怕这么简单的 Unix 么?

 

 

( 转载时请注明作者和出处。未经许可,请勿用于商业用途 )

更多文章请访问我的 Blog: http://blog.csdn.net/haoel

 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1533720


其实Unix很简单


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论