大学演讲

我们中有太多人都把青春奉献给了四个字:「按部就班」。按部就班地上了高中、大学,读了研究生,找了工作;按部就班地找到了男女朋友,生了孩子。

 

在别人眼中,我们都是「优秀」的代名词,而你自己始料未及的是,在不断的「优秀」当中,我们却把自己的人生活成了「平庸」。

 

1「你要做什么?」

What are You Going to Do?What Are You Going to Do With That?

 

我的题目提出的问题,当然,是一个经典的面向人文科学的专业所提出的问题:学习文学、艺术或哲学能有什么实效价值?

 

你肯定纳闷,我为什么在以科技闻名的斯坦福提出这个问题呢?大学学位当然是给人们带来众多的机会,这还有什么需要质疑的吗?

 

但那不是我提出的问题。这里的「做」并不是指工作,「那」也不是指你的专业。我们的价值不仅仅是我们的工作,教育的意义也不仅仅是让你学会你的专业。

 

教育的意义大于上大学的意义,甚至大于你从幼儿园到研究生院所接受的所有正规学校教育的意义。

 

我说的「你要做什么」的意思是你要过什么样的生活?我所说的「那」指的是你得到的正规或非正规的任何训练,那些把你送到这里来的东西,你在学校的剩余时间里将要做的任何事。

 

2 「有一天醒来」

Waking Up one day

 

你是如何从活泼能干的 19 岁年轻人,变成了只想一件事的 40 岁中年人?

 

我们不妨先来讨论你是如何考入斯坦福的吧。你能进入这所大学说明你在某些技能上非常出色。你的父母在你很小的时候就鼓励你追求卓越。他们送你到好学校,老师的鼓励和同伴的榜样作用激励你更努力地学习。

 

除了在所有课程上都出类拔萃之外,你还注重修养的提高,充满热情地培养了一些特殊兴趣。你参加了许多课外活动,参加私人课程。你用几个暑假在本地大学里预习大学课程,或参加专门技能的夏令营或训练营。你学习刻苦、精力集中、全力以赴。所以,你可能在数学、钢琴、曲棍球等方面都很出色,甚至是个全能选手。

 

掌握这些技能当然没有错,全力以赴成为最优秀的人也没有错。错误之处在于这个体系遗漏的地方:即任何别的东西。

 

我并不是说因为选择钻研数学,你在充分发展话语表达能力的潜力方面就失败了;也不是说除了集中精力学习地质学之外,你还应该研究政治学;也不是说你在学习钢琴时还应该学吹笛子。毕竟,专业化的本质就是要专业性。

 

可是,专业化的问题在于它把你的注意力限制在一个点上,你所已知的和你想探知的东西都限界于此。真的,你知道的一切就只是你的专业了。

 

专业化的问题是它只能让你成为专家,切断你与世界上其他任何东西的联系,不仅如此,还切断你与自身其他潜能的联系。

 

当然,作为大一新生,你的专业才刚刚开始。在你走向所渴望的成功之路的过程中,进入斯坦福是你踏上的众多阶梯中的一个。再读三年大学,三五年法学院或医学院或研究型博士,然后再干若干年住院实习生或博士后或者助理教授。总而言之,进入越来越狭窄的专业化轨道。

 

你可能从政治学专业的学生变成了律师或者公司代理人,再变成专门研究消费品领域的税收问题的公司代理人。你从生物化学专业的学生变成了博士,再变成心脏病学家,再变成专门做心脏瓣膜移植的心脏病医生。

 

我再强调一下,你这么做当然没有什么错。只不过,在你越来越深入地进入这个轨道后,再想回忆你最初的样子就越发困难了。

 

你开始怀念那个曾经谈钢琴和打曲棍球的人,思考那个曾经和朋友热烈讨论人生和政治以及在课堂内容的人在做什么。那个活泼能干的 19 岁年轻人已经变成了只想一件事的 40 岁中年人。

 

难怪年长的人总是显得那么乏味无趣。「哎,我爸爸曾经是非常聪明的人,但他现在除了谈论钱和肝脏外再无其他。」

 

还有另外一个问题,就是或许你从来就没有想过当心脏病医生,只是碰巧发生了而已。

 

随大流最容易,这就是体制的力量。我不是说这个工作容易,而是说做出这种选择很容易。或者,这些根本就不是自己做出的选择。

 

你来到斯坦福这样的名牌大学是因为聪明的孩子都这样。你考入医学院是因为它的地位高,人人都羡慕。你选择心脏病学是因为当心脏病医生的待遇很好。你做那些事能给你带来好处,让你的父母感到骄傲,令你的老师感到高兴,也让朋友们羡慕。

 

从你上高中开始,甚至初中开始,你的唯一目标就是进入最好的大学,所以现在你会很自然地从「如何进入下个阶段」的角度看待人生。「进入」就是能力的证明,「进入」就是胜利。

 

先进入斯坦福,然后是约翰霍普金斯医学院,再进入旧金山大学做实习医生等。或者进入密歇根法学院,或高盛集团或麦肯锡公司或别的什么地方。你迈出了这一步,似乎就必然会迈出下一步。

 

也许你可能确实想当心脏病学家。十岁时就梦想成为医生,即使你根本不知道医生意味着什么。你在上学期间全身心都在朝着这个目标前进。你拒绝了上大学预修历史课的美妙体验的诱惑,也无视你在医学院第四年儿科病床轮流值班时照看孩子的可怕感受。

 

但不管是哪种情况,要么因为你是随大流,要么因为你早就选定了道路, 20 年后某天你醒来,你可能会纳闷到底发生了什么:你是怎么变成了现在这个样子,这一切意味着什么。

 

不是说在宽泛意义的事情,而是它对你意味着什么。 你为什么做它,到底为了什么呢。这听起来像老生常谈,但这个被称为中年危机的「有一天醒来」的情况一直就发生在每个人身上。

 

3 「创造新活法的能力」

Reinventing your own life

 

真正的创新,是创造新的可能性,是创造你自己的生活。

 

不过,还有另外一种情况,或许中年危机并不会发生在你身上。让我告诉你们一个你们的同龄人的故事来解释我的意思吧,即她是没有遇到中年危机的。

 

几年前,我在哈佛参加了一次小组讨论会,谈到这些问题。后来参加这次讨论的一个学生给我联系,这个哈佛学生正在写有关哈佛的毕业论文,讨论哈佛是如何给学生灌输她所说的「自我效能」,一种相信自己能做一切的意识。

 

自我效能或更熟悉的说法「自我尊重」。她说在考试中得了「优秀」的学生中,有些会说「我得优秀是因为试题很简单。」但另外一些学生,那种具有自我效能感或自我尊重的学生,会说「我得了优秀是因为我聪明。」

 

我得再次强调,认为得优秀是因为自己聪明的想法并没有任何错。不过,哈佛学生没有认识到的是他们没有第三种选择。

 

当我指出这一点时,她十分震惊。

 

我指出,真正的自尊意味着最初根本就不在乎成绩是否优秀。真正的自尊意味着,尽管你在成长过程中的一切都在教导你要相信自己,但你所达到的成绩,还有那些奖励、成绩、奖品、录取通知书等所有这一切,都不能来定义你是谁。

 

她还说,哈佛学生把他们的这种自我效能带到了社会上,并将自我效能重新命名为“创新”。

 

但当我问她「创新」意味着什么时,她能够想到的唯一例子不过是「当上世界大公司五百强的首席执行官」。我告诉她这不是创新,这只是成功,而且是根据非常狭隘的成功定义而认定的成功而已。

 

真正的创新意味着运用你的想象力,发挥你的潜力,创造新的可能性。

 

但在这里我并不是想谈论技术创新,不是发明新机器或者制造一种新药。

 

我谈论的是另外一种创新,是创造你自己的生活。不是走现成的道路而是创造一条属于自己的道路。

 

我谈论的想象力是道德想象力。「道德」在这里与对错无关,而与选择有关。道德想象力是那种能创造新的活法的能力。

 

它意味着不随波逐流,不是下一步要「进入」什么名牌大学或研究生院。而是要弄清楚自己到底想要什么,而不是父母、同伴、学校、或社会想要什么。即确认你自己的价值观,思考迈向自己所定义的成功的道路,而不仅仅是接受别人给你的生活,不仅仅是接受别人给你的选择。

 

当今走进星巴克咖啡馆,服务员可能让你在牛奶咖啡、加糖咖啡、浓缩咖啡等几样东西之间做出选择。但你可以做出另外的选择,你可以转身而去。

 

当你进入大学,人家给你众多选择,或法律或医学或投资银行和咨询以及其他,但你同样也可以做其他事,做从前根本没有人想过的事。

 

4 「道德勇气」

Act on your values

 

比想象力更难的,是按自己的价值观行动的勇气。

 

道德想象力是困难的,这种困难与你已经习惯的困难完全不同。

 

不仅如此,光有道德想象力还不够。如果你要创造自己的生活,如果你想成为真正的独立思想者,你还需要勇气:道德勇气。不管别人说什么,有按自己的价值观行动的勇气,不会因为别人不喜欢而试图改变自己的想法。

 

具有道德勇气的个人往往让周围的人感到不舒服。他们和其他人对世界的看法格格不入,更糟糕的是,让别人对自己已经做出的选择感到不安全或无法做出选择。只要别人也不享受自由,人们就不在乎自己被关进监狱。可一旦有人越狱,其他人都会跟着跑出去。

 

在《青年艺术家的肖像》一书中,作者詹姆斯•乔伊斯让主人公斯蒂芬•迪达勒斯就 19 世纪末期的爱尔兰的成长环境说出了如下的名言:

 

「当一个人的灵魂诞生在这个国家时,就会有一张大网把它罩住,防止它飞翔。你们跟我谈论民族性、语言和宗教。但是我想冲出这些牢笼。」

 

今天,我们面临的是其他的网。其中之一是我在就这些问题与学生交流时经常听到的一个词「自我放任」。

 

「在攻读学位过程中有这么多事要做的时候,试图按照自己的感觉生活难道不是自我放任吗?」「毕业后不去找个真正的工作而去画画难道不是自我放任吗?」

 

这些是年轻人只要思考一下稍稍出格的事就不由自主地质问自己的问题。更糟糕的是,他们觉得提出这些问题是理所应当的。许多学生在高年级的时候跟我谈论,他们感受到的来自同伴那里的压力,他们想为创造性的生活或独特的生活正名。

 

你生来就是为了体验你自己的疯狂的:疯狂地打破常规,疯狂地认为事事皆有可能,疯狂地想到你有天赋之权去尝试。

 

想象我们现在面临的局面吧。这是对我们个体,对道德,对灵魂的一个重要见证:美国社会思想的贫乏竟然让美国最聪明的年轻人认为听从自己的好奇心的行动就是自我放任。

 

你们得到的教导是应该上大学去学习,但你们同时也被告知如果你想学的东西不是大众认可的,那就是你的「自我放任」。如果你是自己学习自己感兴趣的东西的话,更是「自我放任」。

 

这是哪个门子的道理?进入证券咨询业是不是自我放任?进入金融业是不是自我放任?像许多人那样进入律师界发财是不是自我放任?搞音乐,写文章就不行,因为它不能给人带来利益。

 

但为风险投资公司工作就可以。追求自己的理想和激情是自私的,除非它能让你赚很多钱。那样的话,就一点儿也不自私了。

 

你看到这些观点是多么荒谬了吗?这就是罩在你们身上的网,就是我说的需要勇气的意思。而且这是永不停息的抗争过程。

 

在两年前的哈佛事件中,有个学生谈到我说的大学生需要重新思考人生决定的观点,他说「我们已经做出了决定,我们早在中学时就已经决定成为能够进入哈佛的高材生。」

 

我在想,谁会打算按照他在 12 岁时做出的决定生活呢? 让我换一种说法,谁愿意让一个 12 岁的孩子决定他们未来一辈子要做什么呢?或者一个 19 岁的小毛孩儿?

 

唯一你能做出的决定是你现在在想什么,你需要准备好不断修改自己的决定。

 

让我说得更明白一些。我不是在试图说服你们都成为音乐家或者作家。成为医生、律师、科学家、工程师或者经济学家,这些都没有什么不好,这些都是可靠的、可敬的选择。

 

我想说的是你需要思考它,认真地思考。我请求你们做的,是根据正确的理由做出你的选择。我在敦促你们的,是认识到你的道德自由并热情拥抱它。

 

5「不要过分谨慎」

Don’t play it safe

 

最重要的是,不要过分谨慎。

 

去抵抗我们社会给予了过高奖赏的那些卑怯的价值观的诱惑:舒服、方便、安全、可预测的、可控制的。这些,同样是罗网。最重要的是,去抵抗失败的恐惧感。

 

是的,你会犯错误。可那是你的错误,不是别人的。你将从错误中缓过来,而且,正是因为这些错误,你更好地认识你自己。由此,你成为更完整和强大的人。

 

人们常说你们年轻人属于「后情感」一代,我想我未必赞同这个说法,但这个说法值得严肃对待。你们更愿意规避混乱、动荡和强烈的感情,但我想说,不要回避挑战自我,不要否认欲望和好奇心、怀疑和不满、快乐和阴郁,它们可能改变你预设的人生轨迹。

 

大学刚开始,成年时代也才刚开始。打开自己,直面各种可能性吧。这个世界的深广远超你现在想象的边际。这意味着,你自身的深广也将远超你现在的想象。

 

作者|威廉·德莱塞维茨

Linux系统

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

Linux操作系统诞生于1991 年10 月5 日(这是第一次正式向外公布时间)。Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。

严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。

外文名

Linux

类别

操作系统

发布时间

1991年的10月5日

创始人

林纳斯·托瓦兹

发行版本

Debian、RedHat、Slackware等

特点

免费、可靠、安全、稳定、多平台

Linux简史

Linux 操作系统的诞生、发展和成长过程始终依赖着五个重要支柱:UNIX 操作系统、MINIX 操作系统、GNU计划、POSIX 标准和Internet 网络。

 

创始人林纳斯·托瓦兹

1981 年IBM公司推出微型计算机IBM PC。

1991年,GNU计划已经开发出了许多工具软件,最受期盼的GNU C编译器已经出现,GNU的操作系统核心HURD一直处于实验阶段,没有任何可用性,实质上也没能开发出完整的GNU操作系统,但是GNU奠定了Linux用户基础和开发环境。

1991年初,林纳斯·托瓦兹开始在一台386sx兼容微机上学习minix操作系统。1991年4月,林纳斯·托瓦兹开始酝酿并着手编制自己的操作系统。

1991 年4 月13 日在comp.os.minix 上发布说自己已经成功地将bash 移植到了minix 上,而且已经爱不释手、不能离开这个shell软件了。

1991年7月3日,第一个与Linux有关的消息是在comp.os.minix上发布的(当然此时还不存在Linux这个名称,当时林纳斯·托瓦兹的脑子里想的可能是FREAX,FREAX的英文含义是怪诞的、怪物、异想天开等)。

1991年的10月5日,林纳斯·托瓦兹在comp.os.minix新闻组上发布消息,正式向外宣布Linux内核的诞生(Freeminix-like kernel sources for 386-AT)。

1993年,大约有100余名程序员参与了Linux内核代码编写/修改工作,其中核心组由5人组成,此时Linux 0.99的代码大约有十万行,用户大约有10万左右。

1994年3月,Linux1.0发布,代码量17万行,当时是按照完全自由免费的协议发布,随后正式采用GPL协议。

1995年1月,Bob Young创办了RedHat(小红帽),以GNU/Linux为核心,集成了400多个源代码开放的程序模块,搞出了一种冠以品牌的Linux,即RedHat Linux,称为Linux”发行版”,在市场上出售。这在经营模式上是一种创举。

1996年6月,Linux 2.0内核发布,此内核有大约40万行代码,并可以支持多个处理器。此时的Linux 已经进入了实用阶段,全球大约有350万人使用。

1998年2月,以Eric Raymond为首的一批年轻的”老牛羚骨干分子”终于认识到GNU/Linux体系的产业化道路的本质,并非是什么自由哲学,而是市场竞争的驱动,创办了”Open Source Intiative”(开放源代码促进会)”复兴”的大旗,在互联网世界里展开了一场历史性的Linux产业化运动。

2001年1月,Linux 2.4发布,它进一步地提升了SMP系统的扩展性,同时它也集成了很多用于支持桌面系统的特性:USB,PC卡(PCMCIA)的支持,内置的即插即用,等等功能。

2003年12月,Linux 2.6版内核发布,相对于2.4版内核2.6在对系统的支持都有很大的变化。

2004年的第1月,SuSE嫁到了Novell,SCO继续顶着骂名四处强行“化缘”, Asianux, MandrakeSoft也在五年中首次宣布季度赢利。3月,SGI宣布成功实现了Linux操作系统支持256个Itanium 2处理器。[1][2]

主要特性

基本思想

Linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。至于说Linux是基于Unix的,很大程度上也是因为这两者的基本思想十分相近。[3]

完全免费

Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变,这让Linux吸收了无数程序员的精华,不断壮大。[4]

完全兼容POSIX1.0标准

这使得可以在Linux下通过相应的模拟器运行常见的DOS、Windows的程序。这为用户从Windows转到Linux奠定了基础。许多用户在考虑使用Linux时,就想到以前在Windows下常见的程序是否能正常运行,这一点就消除了他们的疑虑。[4]

多用户、多任务

Linux支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。多任务则是现在电脑最主要的一个特点,Linux可以使多个程序同时并独立地运行。[4]

良好的界面

Linux同时具有字符界面和图形界面。在字符界面用户可以通过键盘输入相应的指令来进行操作。它同时也提供了类似Windows图形界面的X-Window系统,用户可以使用鼠标对其进行操作。在X-Window环境中就和在Windows中相似,可以说是一个Linux版的Windows。[4]

支持多种平台

Linux可以运行在多种硬件平台上,如具有x86、680×0、SPARC、Alpha等处理器的平台。此外Linux还是一种嵌入式操作系统,可以运行在掌上电脑、机顶盒或游戏机上。2001年1月份发布的Linux 2.4版内核已经能够完全支持Intel 64位芯片架构。同时Linux也支持多处理器技术。多个处理器同时工作,使系统性能大大提高。[4]

桌面环境

介绍

在图形计算中,一个桌面环境(Desktop environment,有时称为桌面管理器)为计算机提供一个图形用户界面(GUI)。但严格来说窗口管理器和桌面环境是有区别的。桌面环境就是桌面图形环境,它的主要目标是为Linux/Unix操作系统提供一个更加完备 的界面以及大量各类整合工具和使用 程序,其基本 易用性吸引着大量的新用户。桌面环境名称来自桌面比拟,对应于早期的文字命令行界面(CLI)。一个典型的桌面环境提供图标,视窗,工具栏,文件夹,壁纸以及像拖放这样的能力。整体而言,桌面环境在设计和功能上的特性,赋予了它与众不同的外观和感觉。

种类

现今主流的桌面环境有KDE,gnome,Xfce,LXDE等,除此之外还有Ambient,EDE,IRIX Interactive Desktop,Mezzo,Sugar,CDE等。

gnome

即GNU网络对象模型环境 (The GNU Network Object Model Environment),GNU计划的一部分,开放源码运动的一个重要组成部分。是一种让使用者容易操作和设定电脑环境的工具。

目标是基于自由软件,为Unix或者类Unix操作系统构造一个功能完善、操作简单以及界面友好的桌面环境,他是GNU计划的正式桌面。

Xfce

即XForms Common Environment,创建于2007年7月,类似于商业图形环境CDE,是一个运行在各类Unix下的轻量级桌面环境。原作者Olivier Fourdan最先设计XFce是基于XForms三维图形库。Xfce设计目的是用来提高系统的效率,在节省系统资源的同时,能够快速加载和执行应用程序。

Fluxbox

是一个基于GNU/Linux的轻量级图形操作界面,它虽然没有GNOME和KDE那样精致 ,但由于它的运行对系统资源和配置要求极低,所以它被安装到很多较旧的或是对性能要求较高的机器上,其菜单和有关 配置被保存于用户根目录下的.fluxbox目录里,这样使得它的配置极为便利。

Enlightenment

是一个功能强大的窗口管理器,它的目标是运用 户轻而易举地配置所见即所得的桌面图形界面。现在Enlightenment的界面已经相当豪华,它拥有像AfterStep一样的可视化时钟以及其它浮华的界面效果,用户不仅可以任意选择边框和动感的声音效果,最有吸引力的是由于它开放的设计思想,每一个用户可以根据自己的爱好,任意地配置窗口的边框、菜单以及屏幕上其它各个部分,而不须要 接触源代码,也不须要 编译任何程序。

文件系统

文件类型

普通文件(regular file):就是一般存取的文件,由ls -al显示出来的属性中,第一个属性为 [-],例如 [-rwxrwxrwx]。另外,依照文件的内容,又大致可以分为:

1、纯文本文件(ASCII):这是Unix系统中最多的一种文件类型,之所以称为纯文本文件,是因为内容可以直接读到的数据,例如数字、字母等等。设 置文件几乎都属于这种文件类型。举例来说,使用命令“cat ~/.bashrc”就可以看到该文件的内容(cat是将文件内容读出来)。

2、二进制文件(binary):系统其实仅认识且可以执行二进制文件(binary file)。Linux中的可执行文件(脚本,文本方式的批处理文件不算)就是这种格式的。举例来说,命令cat就是一个二进制文件。

3、数据格式的文件(data):有些程序在运行过程中,会读取某些特定格式的文件,那些特定格式的文件可以称为数据文件(data file)。举例来说,Linux在用户登入时,都会将登录数据记录在 /var/log/wtmp文件内,该文件是一个数据文件,它能通过last命令读出来。但使用cat时,会读出乱码。因为它是属于一种特殊格式的文件。

目录文件(directory):就是目录,第一个属性为 [d],例如 [drwxrwxrwx]。

连接文件(link):类似Windows下面的快捷方式。第一个属性为 [l],例如 [lrwxrwxrwx]。

设备与设备文件(device):与系统外设及存储等相关的一些文件,通常都集中在 /dev目录。通常又分为两种:

块设备文件:就是存储数据以供系统存取的接口设备,简单而言就是硬盘。例如一号硬盘的代码是 /dev/hda1等文件。第一个属性为 [b]。

字符设备文件:即串行端口的接口设备,例如键盘、鼠标等等。第一个属性为 [c]。

套接字(sockets):这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。第一个属性为 [s],最常在 /var/run目录中看到这种文件类型。

管道(FIFO,pipe):FIFO也是一种特殊的文件类型,它主要的目的是,解决多个程序同时存取一个文件所造成的错误。FIFO是first-in-first-out(先进先出)的缩写。第一个属性为 [p]。[5]

文件结构

/:根目录,所有的目录、文件、设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者。

/bin:bin 就是二进制(binary)英文缩写。在一般的系统当中,都可以在这个目录下找到linux常用的命令。系统所需要的那些命令位于此目录。

/boot:Linux的内核及引导系统程序所需要的文件目录,比如 vmlinuz initrd.img 文件都位于这个目录中。在一般情况下,GRUB或LILO系统引导管理器也位于这个目录。

/cdrom:这个目录在刚刚安装系统的时候是空的。可以将光驱文件系统挂在这个目录下。例如:mount /dev/cdrom /cdrom

/dev:dev 是设备(device)的英文缩写。这个目录对所有的用户都十分重要。因为在这个目录中包含了所有linux系统中使用的外部设备。但是这里并不是放的外部设备的驱动程序。这一点和常用的windows,dos操作系统不一样。它实际上是一个访问这些外部设备的端口。可以非常方便地去访问这些外部设备,和访问一个文件,一个目录没有任何区别。

/etc:etc这个目录是linux系统中最重要的目录之一。在这个目录下存放了系统管理时要用到的各种配置文件和子目录。要用到的网络配置文件,文件系统,x系统配置文件,设备配置信息,设置用户信息等都在这个目录下。

/home:如果建立一个用户,用户名是”xx”,那么在/home目录下就有一个对应的/home/xx路径,用来存放用户的主目录。

/lib:lib是库(library)英文缩写。这个目录是用来存放系统动态连接共享库的。几乎所有的应用程序都会用到这个目录下的共享库。因此,千万不要轻易对这个目录进行什么操作,一旦发生问题,系统就不能工作了。

/lost+found:在ext2或ext3文件系统中,当系统意外崩溃或机器意外关机,而产生一些文件碎片放在这里。当系统启动的过程中fsck工具会检查这里,并修复已经损坏的文件系统。有时系统发生问题,有很多的文件被移到这个目录中,可能会用手工的方式来修复,或移到文件到原来的位置上。

/mnt:这个目录一般是用于存放挂载储存设备的挂载目录的,比如有cdrom等目录。可以参看/etc/fstab的定义。

/media:有些linux的发行版使用这个目录来挂载那些usb接口的移动硬盘(包括U盘)、CD/DVD驱动器等等。

/opt:这里主要存放那些可选的程序。

/proc:可以在这个目录下获取系统信息。这些信息是在内存中,由系统自己产生的。

/root:Linux超级权限用户root的家目录。

/sbin:这个目录是用来存放系统管理员的系统管理程序。大多是涉及系统管理的命令的存放,是超级权限用户root的可执行命令存放地,普通用户无权限执行这个目录下的命令,这个目录和/usr/sbin; /usr/X11R6/sbin或/usr/local/sbin目录是相似的,凡是目录sbin中包含的都是root权限才能执行的。

/selinux :对SElinux的一些配置文件目录,SElinux可以让linux更加安全。

/srv 服务启动后,所需访问的数据目录,举个例子来说,www服务启动读取的网页数据就可以放在/srv/www中

/tmp:临时文件目录,用来存放不同程序执行时产生的临时文件。有时用户运行程序的时候,会产生临时文件。/tmp就用来存放临时文件的。/var/tmp目录和这个目录相似。

/usr

这是linux系统中占用硬盘空间最大的目录。用户的很多应用程序和文件都存放在这个目录下。在这个目录下,可以找到那些不适合放在/bin或/etc目录下的额外的工具

/usr/local:这里主要存放那些手动安装的软件,即不是通过“新立得”或apt-get安装的软件。它和/usr目录具有相类似的目录结构。让软件包管理器来管理/usr目录,而把自定义的脚本(scripts)放到/usr/local目录下面、。

/usr/share :系统共用的东西存放地,比如 /usr/share/fonts 是字体目录,/usr/share/doc和/usr/share/man帮助文件。

/var:这个目录的内容是经常变动的,看名字就知道,可以理解为vary的缩写,/var下有/var/log 这是用来存放系统日志的目录。/var/ www目录是定义Apache服务器站点存放目录;/var/lib 用来存放一些库文件,比如MySQL的,以及MySQL数据库的的存放地。

常用命令及技巧

一。 通用命令:[6]

1. date :print or set the system date and time

2. stty -a: 可以查看或者打印控制字符(Ctrl-C, Ctrl-D, Ctrl-Z等)

3. passwd: print or set the system date and time (用passwd -h查看)

4. logout, login: 登录shell的登录和注销命令

5. pwd: print or set the system date and time

6. more, less, head tail: 显示或部分显示文件内容.

7. lp/lpstat/cancel, lpr/lpq/lprm: 打印文件.

8. 更改文件权限: chmod u+x…

9. 删除非空目录:rm -fr dir

10.拷贝目录: cp -R dir

11. fg jobid :可以将一个后台进程放到前台。

Ctrl-z 可以将前台进程挂起(suspend), 然后可以用bg jobid 让其到后台运行。

job & 可以直接让job直接在后台运行。

12. kill 的作用: send a signal to a process. eg: kill -9 发送的是SIG_KILL信号。。。 具体发送什么信号 可以通过 man kill 查看。

13. ps 的用法, ps -e 或 ps -o pid,ppid,session,tpgid, comm (其中session显示的sessionid, tpgid显示前台进程组id, comm显示命令名称。)

二 .ubuntu常用命令:[6]

1. dpkg: package manager for Debian

* 安装: dpkg -i package

* 卸载: dpkg -r package

* 卸载并删除配置文件: dpkg -P |–purge package

* 如果安装一个包时。说依赖某些库。 可以先 apt-get install somelib…

* 查看软件包安装内容 :dpkg -L package

* 查看文件由哪个软件包提供: dpkg -S filename

* 另外 dpkg还有 dselect和aptitude 两个frontend.

2. apt

* 安装: apt-get install packs

* apt-get update : 更新源

* apt-get upgrade: 升级系统。

* apt-get dist-upgrade: 智能升级。安装新软件包,删除废弃的软件包

* apt-get -f install : -f == –fix broken 修复依赖

* apt-get autoremove: 自动删除无用的软件

* apt-get remove packages :删除软件

* apt-get remove package –purge 删除包并清除配置文件

* 清除所以删除包的残余配置文件: dpkg -l |grep ^rc|awk ‘{print $2}’ |tr [“/n”] [” “]|sudo xargs dpkg -P

* 安装软件时候包的临时存放目录 : /var/cache/apt/archives

* 清除该目录: apt-get clean

* 清除该目录的旧版本的软件缓存: apt-get autoclean

* 查询软件some的依赖包: apt-cache depends some

* 查询软件some被哪些包依赖: apt-get rdepends some

* 搜索软件: apt-cache search name|regexp

* 查看软件包的作用:apt-cache show package

* 查看一个软件的编译依赖库: apt-cache showsrc packagename|grep Build-Depends

* 下载软件的源代码 : apt-get source packagename (注: sources.list 中应该有 deb-src 源)

* 安装软件包源码的同时, 安装其编译环境 :apt-get build-dep packagename (有deb-src源)

* 如何将本地光盘加入安装源列表: apt-cdrom add

3. 系统命令:

* 查看内核版本: uname -a

* 查看ubuntu 版本: cat /etc/issue

* 查看网卡状态 : ethtool eth0

* 查看内存,cpu的信息: cat /proc/meminfo ; cat /proc/cpuinfo

(/proc下面的有很多系统信息)

* 打印文件系统空间使用情况: df -h

* 查看硬盘分区情况: fdisk -l

* 产看文件大小: du -h filename;

* 查看目录大小: du -hs dirname ; du -h dirname是查看目录下所有文件的大小

* 查看内存的使用: free -m|-g|-k

* 查看进程: ps -e 或ps -aux –>显示用户

* 杀掉进程: kill pid

* 强制杀掉: killall -9 processname

4. 网络相关:

* 配置 ADSL: sudo pppoeconf

* ADSL手工拨号: sudo pon dsl-provider

* 激活 ADSL : sudo /etc/ppp/pppoe_on_boot

* 断开 ADSL: sudo poff

* 根据IP查网卡地址: arping IP地址

* 产看本地网络信息(包括ip等): ifconfig | ifconfig eth0

* 查看路由信息: netstat -r

* 关闭网卡: sudo ifconfig eth0 down

* 启用网卡: sudo ifconfig eth0 up

* 添加一个服务: sudo update-rc.d 服务名 defaults 99

* 删除一个服务: sudo update-rc.d 服务名 remove

* 临时重启一个服务: /etc/init.d/服务名 restart

* 临时关闭一个服务: /etc/init.d/服务名 stop

* 临时启动一个服务: /etc/init.d/服务名 start

* 控制台下显示中文: sudo apt-get install zhcon

* 查找某个文件: whereis filename 或 find 目录 -name 文件名

*通过ssh传输文件

scp -rp /path/filename username@remoteIP:/path #将本地文件拷贝到服务器上

scp -rp username@remoteIP:/path/filename /path #将远程文件从服务器下载到本地

5. 压缩:

*解压缩 a.tar.gz: tar zxvf a.tar.gz

*解压缩 a.tar.bz2: tar jxvf a.tar.bz2

*压缩aaa bbb目录为xxx.tar.gz: tar zcvf xxx.tar.gz aaa bbb

*压缩aaa bbb目录为xxx.tar.bz2: tar jcvf xxx.tar.bz2 aaa bbb[6]

6. Nautilus:

特殊 URI 地址

* computer:/// – 全部挂载的设备和网络

* network:/// – 浏览可用的网络

* burn:/// – 一个刻录 CDs/DVDs 的数据虚拟目录

* smb:/// – 可用的 windows/samba 网络资源

* x-nautilus-desktop:/// – 桌面项目和图标

* file:/// – 本地文件

* trash:/// – 本地回收站目录

* ftp:// – FTP 文件夹

* ssh:// – SSH 文件夹

* fonts:/// – 字体文件夹,可将字体文件拖到此处以完成安装

* themes:/// – 系统主题文件夹

* 显示隐藏文件: Ctrl+h

* 显示地址栏: Ctrl+l

* 查看已安装字体: 在nautilus的地址栏里输入”fonts:///“,就可以查看本机所有的fonts[6]

7.补充部分:

* 查看本地所有的tpc,udp监听端口: netstat -tupln (t=tcp, u=udp, p=program, l=listen, n=numric)

* 通过man搜说相关命令: man -k keyword . eg: man -k user

* 或者用 apropos

* 统计文件所占用的实际磁盘空间: du (du – estimate file space usage)

* 统计文件中的字符,字节数: wc -c/-l/-w (wc – print the number of newlines, words, and bytes in files)

* 查看文件的内容: od -x/-c/…. (od – dump files in octal and other formats)

我认为od最有用的就是文件的字节流了: od -t x1 filename

查看文件的 Ascii 码形式: od -t c filename (其中统计信息最左边的是: 字节数)

* 查找命令所在文件的位置: which od 输出: /usr/bin/od

查看该文件由哪个包提供: dpkg -S /usr/bin/od 输出: coreutils: /usr/bin/od

再查看coreutils包的全部内容就知道了linux的核心命令: dpkg -L coreutils

然后 info coreutils 哈哈,认真学吧, 满世界都是命令!

* 可以用man 命令产看某个命令的所有section 的解释: man -a tty

然后用q,和next 转换到下一个section的解释

* bash 的好用的快捷键:

ctrl+a:光标移到行首。

ctrl+b:光标左移一个字母

ctrl+c:杀死当前进程。

ctrl+d:退出当前 Shell。

ctrl+e:光标移到行尾。

ctrl+h:删除光标前一个字符,同 backspace 键相同。

ctrl+k:清除光标后至行尾的内容。

ctrl+l:清屏,相当于clear。

ctrl+r:搜索之前打过的命令。会有一个提示,根据你输入的关键字进行搜索bash的history

ctrl+u: 清除光标前至行首间的所有内容。

ctrl+w: 移除光标前的一个单词

ctrl+t: 交换光标位置前的两个字符

ctrl+y: 粘贴或者恢复上次的删除

ctrl+d: 删除光标所在字母;注意和backspace以及ctrl+h的区别,这2个是删除光标前的字符

ctrl+f: 光标右移

ctrl+z : 把当前进程转到后台运行,使用’ fg ‘命令恢复。比如top -d1 然后ctrl+z ,到后台,然后fg,重新恢复

* 快速粘贴:先在一个地方选中文字,在欲粘贴的地方按鼠标 中键 即可。

* 等效中键:a 、按下滑轮等效于中键。b、同时按下鼠标 左右键,等效于中键。

* 快速重启X服务: 同时按下: Alt + Ctrl + Backspace 三个键。

* 打开”运行”窗口: 同时按下 Alt + F2 键。

* 戴屏: a、全屏:直接按下 PrtScr 键。

b、当前窗口:同时按下 Alt + PrtScr 键。

c、延时戴屏:在 终端 或 “运行”窗口中输入命令: gnome-screenshot –delay 3 ,将延时 3 秒后戴屏。

* 直接将 文件管理器 中的文件拖到 GNOME终端 中就可以在终端中得到完整的路径名。[6]8.ulimit

ulimit:显示(或设置)用户可以使用的资源的限制(limit),这限制分为软限制(当前限制)和硬限制(上限),其中硬限制是软限制的上限值,应用程序在运行过程中使用的系统资源不超过相应的软限制,任何的超越都导致进程的终止。

ulimited 不限制用户可以使用的资源,但本设置对可打开的最大文件数(max open files)

和可同时运行的最大进程数(max user processes)无效

-a 列出所有当前资源极限

-c 设置core文件的最大值.单位:blocks

-d 设置一个进程的数据段的最大值.单位:kbytes

-f Shell 创建文件的文件大小的最大值,单位:blocks

-h 指定设置某个给定资源的硬极限。如果用户拥有 root 用户权限,可以增大硬极限。任何用户均可减少硬极限

-l 可以锁住的物理内存的最大值

-m 可以使用的常驻内存的最大值,单位:kbytes

-n 每个进程可以同时打开的最大文件数

-p 设置管道的最大值,单位为block,1block=512bytes

-s 指定堆栈的最大值:单位:kbytes

-S 指定为给定的资源设置软极限。软极限可增大到硬极限的值。如果 -H 和 -S 标志均未指定,极限适用于以上二者

-t 指定每个进程所使用的秒数,单位:seconds

-u 可以运行的最大并发进程数

-v Shell可使用的最大的虚拟内存,单位:kbytes

eg: ulimit -c 1000(可以先通过ulimit -c 查看原来的值)[6]

参考资料

[1] 见证Linux操作系统发展历史.天极网 [引用日期2013-02-13]

[2] 回顾Linux20年光辉岁月 网络用户超过14亿.TechWe网 [引用日期2013-02-13]

[3] Linux.iteedu网 [引用日期2013-05-22]

[4] 25款操作系统全面接触.网易网 [引用日期2013-02-6]

[5] LINUX 文件种类.iteye博客(原创) [引用日期2013-02-6]

[6] linux 常用命令及技巧.Linux时代 [引用日期2015-01-21]

C语言实现简单停车场管理系统

问题描述:停车场是一个能放n辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面呢的车要先退出,待它走后再依次进入。汽车离开时按停放时间收费。

 

基本功能要求:

(1)建立三个数据结构分别是:停放队列、让路栈、等候队列。

(2)输入数据模拟管理过程,数据(入或出,车号)。

 

停车管理系统是C语言中队列和栈比较简单的应用,需要注意的是停车队列、等候队列、让路栈结构体的构建。在写代码时,出队列入栈和出栈入队列时,指针容易出错而造成段错误,应当注意。我所写的代码如下:

 

//定义结构体

 

#include <stdio.h>

#include <stdlib.h>

 

#define F 0

#define T 1

#define MAX 3

 

typedef struct Node //数据

{

int number;

int time;

}Node;

 

typedef struct QueueNode //队列结点

{

struct Node infom;

struct QueueNode * next;

}*QueueNode;

 

typedef struct LinkQueue //链队列

{

struct QueueNode * front;

struct QueueNode * rear;

}LinkQueue;

 

typedef struct stack //栈结点

{

struct Node data;

struct stack *next;

}*StackNode;

 

typedef struct LinkStack //链栈

{

StackNode top;

int count;

}LinkStack;

//函数实现

 

void menu(LinkQueue *wait,LinkQueue *park,LinkStack *giveway,int num,int t);//菜单

int init(LinkQueue *wait,LinkQueue *park,LinkStack *giveway);//初始化

int linklength(LinkQueue q);//查看长度

int enqueue(LinkQueue *q,int num,int t);//入队列

int dequeue(LinkQueue *q,int *num,int *t);//出队列

void park1(LinkQueue *wait,LinkQueue *park);//停车函数

int push(LinkStack *s,int num,int t);//入栈

int pop(LinkStack *s,int *num,int *t);//出栈

void leave2(LinkQueue *wait,LinkQueue *park,LinkStack *giveway,int num,int t);//离开函数

void view3(LinkQueue wait,LinkQueue park);//查看停车场状态

 

int main()

{

LinkQueue wait;

LinkQueue park;

LinkStack giveway;

int num = 0;

int t = 0;

init(&wait,&park,&giveway);

menu(&wait,&park,&giveway,num,t);

return 0;

}

 

int init(LinkQueue *wait,LinkQueue *park,LinkStack *giveway)

{

QueueNode newnode1 = (QueueNode)malloc(sizeof(struct QueueNode));

if(NULL == newnode1)

{

return F;

}

newnode1->next = NULL;

wait->front = newnode1;

wait->rear = newnode1;

 

QueueNode newnode2 = (QueueNode)malloc(sizeof(struct QueueNode));

if(NULL == newnode2)

{

return F;

}

newnode2->next = NULL;

park->front = newnode2;

park->rear = newnode2;

 

giveway->top = NULL;

giveway->count = 0;

}

 

void menu(LinkQueue *wait,LinkQueue *park,LinkStack *giveway,int num,int t)

{

printf(**********Welcome to our Car Parking !********);

printf(********** Please choose function ********);

printf(********** 1 : park. ********);

printf(********** 2 : leave. ********);

printf(********** 3 : view. ********);

printf(********** 4 : exit. ********);

int option;

scanf(%d”,&option);

switch(option)

{

case 1:{

park1(wait,park);

printf();

menu(wait,park,giveway,num,t);

break;

}

case 2:{

leave2(wait,park,giveway,num,t);

menu(wait,park,giveway,num,t);

break;

}

case 3:{

view3(*wait,*park);

menu(wait,park,giveway,num,t);

break;

}

case 4:{

printf(********** 欢迎再次使用,谢谢! ********);

break;

}

default:{

printf(********** 请输入正确的指令! ********);

menu(wait,park,giveway,num,t);

break;

}

}

 

}

 

int linklength(LinkQueue q)

{

int i = 0;

while(q.front != q.rear)

{

i++;

q.front = q.front->next;

}

return i;

}

 

int enqueue(LinkQueue *q,int num,int t)

{

QueueNode newnode = (QueueNode)malloc(sizeof(struct QueueNode));

if(NULL == newnode)

{

return F;

}

newnode->infom.number = num;

newnode->infom.time = t;

newnode->next = NULL;

q->rear->next = newnode;

q->rear = newnode;

return T;

}

 

int dequeue(LinkQueue *q,int *num,int *t)

{

if(q->front == q->rear)

{

printf();

return F;

}

*num = q->front->next->infom.number;

*t = q->front->next->infom.time;

QueueNode temp = q->front->next;

q->front->next = temp->next;

if(temp->next == NULL)

{

q->rear = q->front;

}

free(temp);

return T;

}

 

void park1(LinkQueue *wait,LinkQueue *park)

{

printf();

int num,t;

scanf(%d,%d”,&num,&t);

if(linklength(*park) >= MAX)

{

printf();

enqueue(wait,num,t);

}

else

{

enqueue(park,num,t);

}

}

 

int push(LinkStack *s,int num,int t)

{

StackNode newnode = (StackNode)malloc(sizeof(struct stack));

if(NULL == newnode)

{

return F;

}

newnode->data.number = num;

newnode->data.time = t;

newnode->next = s->top;

s->top = newnode;

s->count++;

return T;

}

 

int pop(LinkStack *s,int *num,int *t)

{

if(0 == s->count)

{

printf();

return F;

}

*num = s->top->data.number;

*t = s->top->data.time;

StackNode temp = s->top;

s->top = s->top->next;

free(temp);

s->count–;

return T;

}

 

void leave2(LinkQueue *wait,LinkQueue *park,LinkStack *giveway,int num,int t)

{

printf();

int leavenumber;

scanf(%d”,&leavenumber);

int i = 0;

QueueNode head = park->front;

while(head != park->rear)

{

if(head->next->infom.number != leavenumber)

{

head = head->next;

i++;

}

else

break;

}

int j = 0;

if(i <= MAX-1)

{

while(j != i)

{

dequeue(park,&num,&t);

push(giveway,num,t);

j++;

}

dequeue(park,&num,&t);

}

else

{

printf();

}

while(giveway->top != NULL)

{

pop(giveway,&num,&t);

enqueue(park,num,t);

}

if(linklength(*wait) != 0)

{

dequeue(wait,&num,&t);

enqueue(park,num,t);

}

}

 

void view3(LinkQueue wait,LinkQueue park)

{

printf(******************** 目前停车场状况 ******************);

printf(%d个车位,当前停车场共有%d量车,等待区共有%d量车\n”,

MAX,linklength(park),linklength(wait));

printf(************************************************************);

printf();

QueueNode head1 = park.front;

QueueNode head2 = park.front;

while(head1 != park.rear)

{

printf(%d “,head1->next->infom.number);

head1 = head1->next;

}

printf();

printf();

while(head2 != park.rear)

{

printf(%d “,head2->next->infom.time);

head2 = head2->next;

}

printf();

}