其实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下装一个软件,NDLL放到Windows系统目录下,注册表里写入N个键值,还有不少你不知道的动做。而在Unix装软件,你不用担忧你的系统目录下会莫明其妙地多出些乱七八糟的文件。就是copy那么简单,那怕是rpm自动安装,安装完后,你也可以查询到软件安装后对系统所作的改变。因此,你在Unix下分发你的软件时,你会以为比Windows下要作得简单了许多许多。)          再说说Unix的另外一个最重要的特色——“全部的设备均可以像文件同样地操做”。简单吧。全部的调备,文件、打印机、显示器、终端、网络、软盘、磁带、USBCDROM、等等的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,进程/线程都有IDID很简单易懂,就像咱们的身份证同样。到了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对此有三个比较复杂的APICreateProcessAsUser, 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中还有两个叫作FoxProJ++的东西,FoxPro来自Foxbase,还有个几年,J++好像就没有几年。ActiveX Control彻底是一个失败的技术,而那个叫作VB的编程语言,今天看来,它的确毁了不少颇有潜力的程序员。在COM出现的时候,不知道今天还有多少人还记得一个叫MTS的玩意?今天,不知道还有多少人记得有一个叫ODBC的东西?在这种复杂混乱的Windows世界中,是否让你疲于追赶?今天的.NET不知道又有多少技术会随着时间所沉淀?在Windows上面,咱们学习了许多的失败技术或是说是过渡技术。而咱们的Unix自从上纪70年代以来,就没有多大的变化,而由于Unix应运而生的C语言直到今天依然光彩夺目。我相信这个30多年来久经考验还那么简单的Unix   Unix就是这么简单,各位想在Unix下学开发的朋友,Windows那么复杂的操做系统都过来了,你还会怕这么简单的Unix么?  数据库

相关文章
相关标签/搜索