其实Unix很简单

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

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

2)喜欢用拿Windows来和Unix做比较。http://hovertree.com/menu/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么?

推荐:http://www.cnblogs.com/roucheng/p/3470287.html

时间: 2024-12-28 02:17:02

其实Unix很简单的相关文章

王金战:改变一个差生真的很简单

当一个学生,反复遭遇失败的打击,他就变成了差生,没有一个学生生下来就注定是个差生.所以让一个差生变好真的很简单.    我刚参加工作的时候,不敢说这句话,但是我现在敢说,因为我多年的经历已经证明了这件事情.让一个差生变好真的很简单,怎么做呢?就是反其道而行之.差生是反复遭遇失败的打击后才产生的,让一个差生变好,就是让他反复享受到成功的喜悦,这个学生就会慢慢地变好了.    少年来我就用这样的方法和理念,帮着一个个学生走出困境,走向成功.我深深体会到,作为教师,作为家长,要学会欣赏孩子.特别是对那

【结果很简单,过程很艰辛】记阿里云Ons消息队列服务填坑过程

Maybe 这个问题很简单,因为解决方法是非常简单,但填坑过程会把人逼疯,在阿里云ONS工作人员.同事和朋友的协助下,经过一天的调试和瞎捣鼓,终于解决了这个坑,把问题记下来,也许更多人在碰到类似问题的时候,会开放思路.当然不得不说,Ons的.NET接口还很不完善,甚至没有独立在Windos 2008/2012服务器测试过,希望官方加把力. 1.阿里云ONS介绍 ONS(Open Notification Service)即开放消息服务,是基于阿里开源消息中间件MetaQ(RocketMQ)打造的

我的要求很简单,有历史版本功能。协作我当用不上,没有人可以协作(快盘以前是金山的,2014年快盘被迅雷收购)

国空的网盘很多,如百度,360,115,Dbank,新浪V盘等等.这些网盘的确很大,都TB级别的,但是这些网盘并不适合我的要求.我的要求很简单,有历史版本功能.协作我当用不上,没有人可以协作. 方案一:快盘的同步目录选择也很简单,直接可以在设置账号中进行选择主要同步目录.另外目录或者文件上右击也可以选择同步某一文件夹或者文件.快盘还可以定时同步,并选择不同步的文件类型.相对来说很方便了.快盘的同步机制不太了解,但是只要文档一修改保存,快盘就会自动同步.这和Dropbox比较像,但是机制是否相同就

mysql数据库很简单操作

进入linux系统 root   >/usr/bin/mysql -u root mysql>show databases;                    #查看数据库 mysql>use  testtable;                        #testtable 为所要查看的库,应用数据库 mysql>show tables;                          #查看所有表 mysql>desc abc_table          

魔咒词典------HDOJ杭电1880(字符串的处理,很简单)

Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助. 给你一部魔咒词典.当哈利听到一个魔咒时,你的程序必须告诉他那个魔咒的功能:当哈利需要某个功能但不知道该用什么魔咒时,你的程序要替他找到相应的魔咒.如果他要的魔咒不在词典中,就输出"what?" Input 首先列出词典中不超过100000条不同的魔咒词条,每条格式

实现strcmp很简单的思维

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> void strcom(char *str1 , char *str2,int *num) { int a = 0; int count = 0; //关键在这里 用指针进行循环判断 while (*str1&&*str2) { str1++; str2++; if ((a=*str1 - *str2) != 0) { *num

怎么将pdf转换成word问题真的很简单

你还在寻找将pdf转换成word的方法吗?被网上眼花缭乱的步骤吓到了吗?你不会还在使用office word2003中的Microsoft Office Document Imaging组件来实现pdf转word工作吧.是不是太麻烦了呢?怎么将pdf转换成word问题真的很简单,不需要我们费脑筋,也不需要那么麻烦的操作,这里小编教你一个事半功倍的方法--使用迅捷pdf转换器将pdf转换成word. 经常进行文本格式转换操作的小伙伴们一定知道这款软件吧,不能再简单的操作步骤只需要三步即可完成pdf

手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单

手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 Chrome的更新速度可以说前无古人,现在我每天开机的第一件事就是打开Chrome检查是不是有了新版本.界面清爽.操作人性化.网络备份资料和快速的启动速度令我爱不释手,还有它拥有众多的扩展程序,相对于firefox的插件来说,

关于很简单的设计模式,ui-dao-database,以及JavaBean和util工具类

关于很简单的设计模式,ui-dao-database,以及JavaBean和util工具类 24. 三 / J2EE / 没有评论 简单的j2ee设计模式, UI通过DAO层访问数据库或者xml文档,数据库返回的数据通过JavaBean 封装,JavaBean是实体类是数据库中表的映射. dao层,数据持久层 JavaBean   数据传送对象,实体类. 其他的公共类 图中是基本的设计模式,和如何建立相应的包. 简单的例子: student实体类对应表中的字段 dao层,增删改查 调用DAO层方