软件开发是一个跨度很大的技术工作,在语言方面,有C,C++,Java,Ruby等等等等,在环境方面,又分嵌入式,桌面系统,企业级,WEB,基础系统,或是科学研究。但是,不管是什么的情况,总是有一些通用的基本职业技能。
这些最基本的职业技能通常决定了一个程序员的级别,能否用好这些技能,直接关系到了程序员的职业生涯。很多程序新手也是因为缺少、达不到或是不熟悉在这些基本技能,所以,他们需要有老手带,需要努力补齐这些技能。而高级程序员应该非常熟悉这些基本技能,而且有能力胜任并带领其他经验不足的程序员。
下面这些基本职业技术可以用来做为对一个程序员的评估,很明显,下面的这些技能都可以用来做面试。虽然,还有很多非技术的因素,但对于评估一个程序员的技术能力来说,其应该是足够的了。
下面是程序员所应该具备的基本职业技能:
基本技能 | 技能描述 |
阅读代码 | 这个技能需要程序员能够具备读懂已经存在的代码的能力,这样的能力可以让程序员分析程序的行为,了解程序,这样才能和开发团队一起工作,继承维护或是改进现有的程序。 |
编写程序 | 编写程序并不包括程序设计。不要以为编程是一件很简单的事情,很多程序员都认为编程只需要懂得程序语言的语法,并把设计实现就可以了。但是这离编写程序还远远不够,使用什么样的编码风格成为编写程序员最需要具备的基本技能。能否使用非常良好的编程风格直接决写了程序员的级别。 |
软件设计 | 这一能力直接决定了需要吏用什么样的代码技术达到怎么样的功能,而系统架构设计直接决定了软件的质量、性能和可维护性。并不是所有的程序在这一方面都非常优秀,但每个程序员都需要或多或少的明白和掌握这一基本技能。 |
熟悉软件工程 | 每个程序员都应该明白软件工程是什么东西,都应该知道,需求分析,设计,编码,测试,Release和维护这几个阶段。当然,几乎所有的人都知道这些东西,但并不是每个人都很清楚这些东西。现在很多高级程序员都会混淆"需求规格说明书FS"和"概要设计HLD"。另外,程序员还需要知道一些软件开发的方法论,比如:敏捷开发或瀑布模型。 |
使用程序库或框架 | 一个程序员需要学会使用已有的代码,无论是标论的程序库,或是第三方的,还是自己公司内部的,都需要学会做。比如:C++中,需要学会使用STL,MFC,ATL,BOOST,ACE,CPPUNIT等等。使用这些东西,可以让你的工作事半功倍。 |
程序调试 | 程序调试是分析BUG和解决问题最直接的能力。没有人能够保证程序写出来不用调试就可以运行正常,也没有人可以保证程序永远不会出BUG。所以,熟练使用调试器是一个程序员需要具备的基本技能。 |
使用IDE | 学会使用IDE工具也会让你的工作事半功倍。比如,VC++,Emacs,Eclipse等等,并要知道这些IDE的长处和短处。 |
使用版本控制 | 一定要学会使用版本控制工具,什么叫mainline/trunk,什么叫tag,什么叫branch,怎么做patch,怎么merge代码,怎么reverse,怎么利用版本控制工具维护不同版本的软件。这是程序员需要明的的软件配置管理中最重要的一块。 |
单元测试 | 单元测试是每个程序都需要做的。很多单元测试也是需要编码的。一定要学会在xUnit框架下进行单元测试。比如JUnit, NUnit, CppUnit等等。 |
重构代码 | 每个程序员都需要有最基本的能力去重构目前已有的代码,使代码达到最优但却不能影响任何的已有的功能。有一本书叫《软件的重构》,每个程序员都应该读一下。 |
自动化编译 | 程序员需要使用一个脚本,其能自动化编程所有的工程和代码,这样,整个开发团队可以不停地集成代码,自动化测试,自动化部署,以及使用一些工具进行静态代码分析或是自动化测试。 |
当然,还有很多的基本技术也是非常重要的,比如,与人的沟通能力,语言的表达能力,写作能力,团队协作能力,适应变化的能力,时间管理能力,多任务处理能力,自我学习能力,故障处理能力,等等,等等,这里只是列举了和技术相关的能力,这些是程序最最最基本的能力,只要是程序员就必需要有的能力。
文章来源:
http://sohu2000000.spaces.live.com/Blog/cns!87FC8F72BEB4FD03!445.entry
posted @
2010-03-25 06:31 sohu2000000 阅读(126) |
评论 (0) |
编辑 收藏
很早以前就想写一篇和面试相关的文章了,今天在网络上看到一篇关于如何去面试程序员的英文文章,发现其中有很多和我共鸣的东西,所以仿照其标题通过自己的经历写下了这篇文章。
工作这么多年来,既被面试过,也面试过他人,对于程序员的面试,经历过很不错的面试,很专业的面试,也经历过一些BT和令人不爽的面试,我个人觉得一个好的面试,面试官是很重要的,所以,本文想从"面试官"的角度来阐述一下。于是,有了下面这样一篇的文章,希望本文对你的职场经历有用,特别是那些正在招聘和面试程序员的朋友,我觉得这篇文章会对大家有很多启示。此外,做为被面试的人,你可以看看本站的《别的程序员是怎么读你的简历的》《程序员需要具备的基本技能》《优秀程序员的十个习惯》其它一些和程序员相关的文章。
对于招聘方来说,在招聘程序员的时候,我估计面试应聘者时,最主要想知道的是下面三件事:
这个程序员的是否够聪明?
这个程序员能否把事情搞定?
这个程序员能和我的团队在一起工作吗?
我相信,这是所有团队经理招人要考虑的三个问题,所有的问题也基本上围绕着这三个问题。有些时候,你也许觉得程序员的技术技能可以同时解决这三个问题,一个技术能力优秀的人必然是一个聪明的,可以搞定事情的人,当然也就能和团队一起工作了。是的,感觉看起来是这个样子,但其实并不是这样的。有些人的确很聪明,但却不能处理好工作上的事情,这样人应该是你的朋友,你的顾问,但不应该是你的雇员。有的人为人很不错,和团队所有人都合得来,但并不是很聪明,但工作很刻苦很努力,这样的人可以成为你的下属,比如某个下属骨干的助手,或是整个团队的助手。如果某个人不能和团队一起工作,无论其有多聪明,解决问题的能力有多强,你都不应该和他在一起工作。人个认为,团队的和谐是一切事情的前提。
对于传统的面试招聘过程,基本上来说都是下面这样的样子的:
阅读应聘者的简历,让应聘者做个自我介绍。
问一些比较难的非常细节的技术问题,以一问一答的形式。
给面试者一些和几个编程难题。(比如某些怪异的算法题)
我个人觉得这种面试方法很可笑,也很糟糕,尤其是后面两点。通常来说,这样的面试只会让你面试到一些"书呆子"或是一些"技术痴迷者",下面让我来一条一条地剖析一下这几条的弊端。
你很难从一个人的简历或是自我介绍上了解一个人。因为这些都是当事人自己写的,或是自己阐述的。所以,这并不是很准确的,通过简历,你只能知道很简单的事情,这对于是否能招入团是远远不够的。而在面试的开始,让应聘者做自我介绍,只会让面试者以很正式的态度来面对整个面试。一但面试过程很正式,很严肃,就会让人很拘禁,其实,这并不是我们想要的,我要的是应聘者真实和自然的表现,从而才能了解到最真实的东西。
问几个技术难题。比如:我个人经历过的——"ps的-a参数是什么意思?","vi中删除换行符的命令是什么?","C++的关键字explict,mutable是用来干什么?"等等,等等。以前做为一个应聘者来说,我非常讨厌这样的问题,因为这样的问题查一下手册就知道。难道他要招的是一个字典手册?不是一个人?对于这方面,重要的不是知识,重要的是其查找知识的能力。
给应聘者一个或几个很难的算法题,给上十几分钟,然后让面试者把伪代码或是代码写下来。这样的做法是相当可笑的,不能讨论不能查资料,让人在一种压力状态下作答,这根本就不是实际工作中的状态,而我们的面试也就成了一种刁难(我最变态的经历是,当我把写在两页纸上的代码上交上去后,面试官把其交给旁边程序员输出电脑做校验,结果程序员说,编译出错。于是,面试官说,"很遗憾,可能你写的程序还不多",相当可笑)。对于这点来说,重要的不是那个解题的答案,而是解题的思路和方法。
我以前经历过很多的面试,当技术人员来和我做面试的时候,我发现,"技术人员的思维"对于某些人来说根本分不清面试和考试,在潜意识里,他们在很多时候不是在面试这个人,而是在刁难这个人并以此展示自己的技能。我个人认为我是一个好的程序员,但我可以告诉你我无法通过那样的面试,因为那样的面试是为他们自己准备的,而不是为应聘者准备的。
那么,我又是怎样去面试的呢?
一、确认简历。
首先,阅读一下别人的简历是需要的,从简历上,工作经历,项目经历,技术技能这三个事情是你需要了解的。一般来说,你可以先通过电话确定一下他的工作经历,项目经历和技术技能,然后,如果他和你需要的人条件相符的话,可以叫到公司做面对面的面试。千万不要把别人叫来,你又说你的经历和我们的工作有差距之类的话。(我有过一次面试经历,公司我不说了,反正是那个号称需要有良好沟通的公司,面试了我9次左右,从一般的程序员,PM,经理,到总经理,而最后一次直接告诉我,我以前的经历和他们的要求差距很大。我不禁要问了,前面若干次的面试他们都在干什么呢?)
二、面试开场。
其次,把人邀请来公司面试,应聘者到了公司来面试,有一点很重要,那就是你一定要让整个面试过程变得很随意,很放松,就像普通的聊天和一般朋友间的交流一样。这样应聘者才会放松并拿出真实的样子来和你谈话和聊天,你才能在很短的时间内了解得更多。让应聘者放下心理负担,让其表现得自然一些,这是招聘方的责任。千万不要说,别人太紧张发挥的不好,有时候,招聘方得想想自己的问题。
面试开场的时候,千万不要让应聘者介绍自己,因为,应聘者早就给你发过简历了,而你也给其打过电话了。另外,应聘者对这个面试惯例通常都会准备得非常不错的,另一方面,这会让整个面试过程太正式太严肃了。所以,不妨问问应聘者是怎么过来的?最近怎么样?还可以和应聘者谈一个大众话题,比如喜欢什么体育,音乐,电影,社会热点什么的,自己也别板着个脸,说说笑笑,试图让大家都放松下来。另外,通过这些闲聊,你可以知道他/她的与人交往能力和一些性格。另外,不要让桌子放在你和应聘者之间,把环境搞得随意一些。
三、多让应聘者说说他的经历。
接下来,如果你要觉得这个应聘者是否是一个可以解决问题,是一个可以把事情搞定的人,不用问他/她会做什么,直接问问其做过什么?干过什么事?对于一个好的程序员来说,很难想像其没有相关的实践,就算你是在大学里,你也应该做过什么。如果你有解决问题的能力,那么,很显然,今天你应该解决了很多问题,也搞定了很多事情,听听应聘者说一说他的那些事。(不要使用一问一答这种方式,应该让应聘者多说,而多听,多想)
在他讲他的项目的时候,通常来说你要注意下面几点:
沟通表达能力。
应聘者能不能把一个事情讲清楚。如果这个人聪明的话,他就可以用最简单的语言把一个复杂的事情讲清楚。而且,这是一个好的程序员最基本的能力。而且,你可以在应聘者一边描述其经历的时候,你可以和应聘者有一些的良好的来来回回的交谈,这样就可以知道,他的沟通能力和沟通方式,从而了解他的性格,。
角色和位置。
也许他参与了一个很大的项目,但只是做了一个很简单的模块。所以,了解其在项目中的担任的角色和位置是非常必要的。当应聘者说到"我们"或者"大家"之类的词汇时,一定要向下细化和明确。
做出的贡献和解决了什么的问题。这个很重要,通过了解这个,你可以知道面试者是否聪明,是否有能力解决问题,是否有好的技术底子。
演示。如果可能,你可以让应聘者展示一些其写过的代码,做过的设计,或是直接给你看看他写的程序的演示。(从设计上,代码的风格,重用性,维护性上你可以了解很多很多)
基础知识。
了解该项目中应聘者使用的技术的一些基础知识,比如,通过整个过程,你可以问一些网络,语言,面象对象,系统的一些基础知识。基础知识是非常重要的,这直接关系到了他的能力。
流程和工具。
了解应聘者所熟悉的项目的流程(银弹,瀑布,敏捷,……),还有流程中的一些工件(如:需求文档,设计文档,测试方档等),以及在开发过程中使用的工具(内存测试,代码检查,BUG报告,版本维护,开发调试……)(关于程序员的基本技能,你可以参考——《程序员需要具备的基本技能》)
有人会说,应聘者的经历可以被他自己编出来的,他可以把一些不是他做的事说成是他做的。是的,的确是有这种可能。不过,不要忘了,一个谎言背后需要用更多的谎言来圆谎的,所以,你不必担心这个问题,只要你在应聘者的描述过程中逐步求精,细化问题,你会知道应聘者是否是在编故事的。
千万记住下面几点:
谈话风格要随意和自然,不要正式。
在了解应聘者以前做过的事的时候,不要太投入了。因为招聘方也是技术人员,所以有时候,招聘者自己会因为应聘者所做的项目中的技术太过迷人而被吸引了。 要注意引导应聘人。相信我,应聘的程序员十个人有八个人讲不清楚以前做的是什么。因为他们直接跳过了项目背景和要解决什么样的问题,而直接进入具体实现。
不要一问一答,应该多让应聘者说,这样才能多全方位了解一个人。
了解一个人的过去,了解一个人做过的事情,比其会做什么更重要。
了解一个人的性格,想法,思维和行为,比了解其技术技能更重要。
沟通能力,表达能力,语言组织能力,理解能力,等方面的能力,关系到了是否能和别人一起工作。
基础知识比知识的点滴要重要得多。你可能不知道其个C++的关键字,但你应该要知道C++的继承和多态。
技术技能固然很重要,但比其更重要的是这个人获取知识的能力,学习能力是在计算机这样变化飞快行业中必需具备的。是否可以进行培养,比掌握的技能更重要。
四、实际参与 ??
这一步可能是很不好实施的。因为,这需要一些应聘者付出一定的时间,如果是毕业生,那没有问题,先让他来实习一段时间。但如果别人有工作,就不好了。也许你会说,这就是试用期的用处了。不过,我个人觉得,你得要尊重应聘者,人家把那边的工作辞了,来你这边工作,三个月试用期间,如果没有什么原则上的问题,你作为一个招聘方又反悔了,这样做很是相当的不好。如果发现这样的事,只能是招聘者自己的问题。
在面试过程中,一些招聘者会让应聘者们一起做个游戏,或是搞个辩论比赛,或是现场组个团队干个简单的事情,有的甚至让应聘者请一天假到自己的公司里来和自己的团队一同工作一天,并要完成某个事情(甚至给其设置上deadline),并通过这些来考量应聘者的实际参与能力。是的,如果没有一起工作过,没有一些实际的事情发生,单靠几个小时的面试很难了解一个人的。设置上这些面试的环节,在最短的时间内来了解应聘者的一切,对于招聘方来说无可厚非。而且有的时候也能得到不错的效果。在这里,我只提一点,有时候这样的周期拉得很长,让应聘者付出了很多,反尔会让应聘者产生反感和厌烦情绪,从某种意义上来说,这实在是对应聘者的不尊重。
对于这一点,我一直持疑问的态度,所以,我在其后打了两个问号。老实说,对于实际参与这一环节,我个人的意见是适可而止,因为时间太短了,无论你怎么做你都无法了解完整。即然无法了解完整,那就获取你最需要的吧,就是本文开头的那三个问题,以及上面所述的"第三点"(了解应聘者的以往经历)。
文章来源:
http://sohu2000000.spaces.live.com/Blog/cns!87FC8F72BEB4FD03!444.entry
posted @
2010-03-25 06:17 sohu2000000 阅读(88) |
评论 (0) |
编辑 收藏
收到Email notification的时候有点懵。原来我申请过Oracle的。 不过貌似我的Online Resume只填了Family Name, Email, University。不过不管它,先做了Online Testing再说。
Online Testing
先说Online Testing,这部分由于我选择的是QA,所以大部分都是技术上的,也有一小部分是测RP的。
题目跟之前看到的网测题目都不一样,可能是不同职位又或者其它什么原因的。
Oracle的Online Testing是外包给一家给大企业做Online Testing Service的网站做的,全English。
难度很好,我是指控制地很好。不会说考偏题怪题,也不会像国内的公司考笔试时出题的人想尽脑汁想着怎么踢掉你。
不过字很小,要很仔细很认真的看。它的Online Testing给我的感觉是像一个人在和你喝着Coffee的时候慢慢地和你聊技术的问题,题目在一个section内基本上是连贯的,你上一道题的理解会影响到你下一道题的理解,尤其是在java的部分。感觉不BT,不够也是挺保守的,估计和公司文化有关吧。Online Testing会在一个月给你结果。我的还没拿到。 貌似参加一面的话,大部分都有2个A,1个average。 不过具体是怎样我不清楚, 这只是在线网友统计的结果。
一面面试
Oracle的招聘在面试之前貌似都是外包给其它公司负责的。当然这是我的猜测。
起因在于我接到通知去面试的MM的电话的时候听错日期,结果到国际金融广场的时候前台接待的MM一脸困惑。遂致电通知面试的MM,她楞了下,然后问我,是Oracle的么?然后说她找找再打回来。最终确定时间是19号,笔试完接着面试。不过正装和English version的简历并没有被提及。通知的MM会告诉你要带什么,so,不必担心漏掉什么。
面试前的笔试
笔试的题目很少,4道题。2道IQ,2道很基础的技术题目。
不过时间并不是按通知我的MM说的那样,比较的弹性,先来的可以先面试。 先说说Oracle出场的"选手"——4位经理。话说听到4位经理时我有点吓一跳(=_= 原谅我见识不够广),一次就face 4个经理,我只面个小小的QA而已?后来接待我做笔试的经理解释是一次见2个,共两轮,面完一组后要通知他,他会安排第2轮。
我还以为Oracle真舍得下血本呢,算了,YY吧。
笔试时,负责接待的经理看了一个穿正装的同学一眼,然后问了句:"你昨天参加移动到面试了吧?好像昨天在香格里拉见过你"。貌似那位被问到的同学有点2,哈哈。深表同情。嗯,那经理记性不错,哈哈。
面试
面试的一部分需要用英文对话。 当然brief introduction肯定是要的。 接下来怎么问就看经理个人爱好了。
我的第一组被要求用英语介绍广州,第二组被要求用英语介绍自己的intern programme。
第一组会侧重于技术和项目经验,第二组也会有一点技术,不过会比较类似对你的抗压力测试,我不幸在此中招。
第一组简单点说就是对你简历说的技能进行面试。
第二组简单点说就是会你的创新能力、适应能力以及应变能力进行测试。 总结的经验是之前缺乏类似经验,交学费去了。
Summary
一面完后统计了一下,一上午有7个人左右(记不清了)面试,Oracle广州的一面面试共2天,也就是说一面的人大概会有30个人。
算上这帮人全国去的地区(上海、北京等等),估计应该会有200人左右争4个current openning。算了,挂了也不算什么。
Oracle的终面已经over了,貌似说一个人4个钟。整体来说Oracle的招聘会给人那种真的是在真诚地找他们需要的人的感觉。
另外很重要的一点就是,面试一定要把握主动,主动引导
文章来源:
http://sohu2000000.spaces.live.com/Blog/cns!87FC8F72BEB4FD03!429.entry
posted @
2010-03-24 04:04 sohu2000000 阅读(134) |
评论 (0) |
编辑 收藏
1. What are two methods of retrieving【v 取回;恢复;补偿;(美)(计算机的)检索(retrieve的ing形式)】 SQL?
Answer:
SELECT statement, cursors
2. What cursor type do you use to retrieve multiple recordsets?
Answer:
Explicit cursor can be used to retrieve and return the multiple records. Ref cursor also do the same job.
3. What action do you have to perform before retrieving data from the next result set of a stored procedure?
Answer:
Move the cursor down one row from its current position.
A ResultSet cursor is initially positioned before the first row.
Before you can get to the first row, you would need to Move the cursor down by one row
( For ex: in java the first call to next makes the first row the current row;
the second call makes the second row the current row, and so on).
4. What is the basic form of a SQL statement to read data out of a table?
Answer:
SELECT * FROM table_name;
5. What structure can you have the database make to speed up table reads?
Answer:
The question is not correct.
"What structure can you have the database make to speed up table reads?"
It is not clear what exactly the term "structure" means in this case.
Follow the rules of DB tuning
we have to:
1) properly use indexes ( different types of indexes)
2) properly locate different DB objects across different tablespaces, files and so on.
3) Create a special space (tablespace) to locate some of the data with special datatypes( for example CLOB, LOB and ...)
4)...
5)...
6. What is a "join"?
Answer:
Joins merge the data of two related tables into a single result set, presenting a denormalized 【非规范化】view of the data.
7. What is a "constraint"?
Answer:
A constraint allows you to apply simple referential integrity checks to a table.
There are 5 primary types of constraints that are currently supported by SQL Server:
PRIMARY/UNIQUE - enforces uniqueness of a particular table column.
DEFAULT - specifies a default value for a column in case an insert operation does not provide one.
FOREIGN KEY - validates that every value in a column exists in a column of another table.
CHECK - checks that every value stored in a column is in some specified list
NOT NULL - is a constraint which does not allow values in the specific column to be null.
And also it is the only constraint which is not a table level constraint.
8. What is a "primary key"?
Answer:
Primary Key is a type of a constraint enforcing uniqueness and data integrity for each row of a table.
All columns participating in a primary key constraint must possess the NOT NULL property.
9. What is a "functional dependency"? How does it relate to database table design?
Answer:
What functional dependence in the context of a database means is that:
Assume that
a table exists in the database called TABLE
with a composite primary key (A, B)
and other non-key attributes (C, D, E).
Functional dependency in general, would mean that :
any non-key attribute - C D or E being dependent on the primary key (A and B) in our table here.
Partial 【局部的;不公平的;[口]偏爱的】functional dependency, on the other hand, is another corollary 【推论;必然的结果】of the above, which states that all non-key attributes - C D or E - if dependent on the subset of the primary key (A and B) and not on it as a whole.
Example :
----------
Fully Functional Dependent : C D E --> A B
Partial Functional dependency : C --> A, D E --> B
10. What is a "trigger"?
Answer:
A trigger is a database object directly associated with a particular table.
It fires whenever a specific statement/type of statement is issued against that table.
The types of statements are insert, update, delete and query statements.
Basically, trigger is a set of SQL statements that execute in response to a data modification/retrieval event on a table.
Other than table triggers there are also schema and database triggers.
These can be made to fire when new objects are created, when a user logs in, when the database shutdown etc.
Table level triggers can be classified into row
statement level triggers and those can be further broken down into before and after triggers.
Before triggers can modify data.
11. What is "index covering" of a query?
Answer:
A nonclustered 【非聚集索引(nonclustered index)是建立的索引表(个人觉得,就是查询目录嘛)】index that includes (or covers) all columns used in a query is called a covering index.
When SQL server can use a nonclustered index to resolve the query, it will prefer to scan the index rather than the table, which typically takes fewer data pages. If your query uses only columns included in the index, then SQL server may scan this index to produce the desired output.
12. What is a SQL
view?
Answer:
View is a precomplied SQL query which is used to select data from one or more tables.
A view is like a table but it doesn't physically take any space.
View is a good way to present data in a particular format if you use that query quite often.
View can also be used to restrict users from accessing the tables directly.
A view otherwise known as a virtual table is a mere【仅仅的;只不过的】 window over the base tables in the database.
This helps us gain a couple of advantages:
1) Inherent security exposing only the data that is needed to be shown to the end user
2) Views are updateable based on certain conditions.
For example, updates can only be directed to one underlying table of the view. After modification if the rows or columns don't
comply with 【照做,遵守】the conditions that the view was created with, those rows disappear from the view.
You could use the CHECK OPTION with the view definition, to make sure that any updates to make the rows invalid
will not be permitted to run.
3) Views are not materialized (given a physical structure) in a database.
Each time a view is queried the definition stored in the database is run against the base tables to retrieve the data.
One exception to this is to create a clustered index 【聚集索引】 on the view to make it persistent in the database.
Once you create a clustered index on the view, you can create any number of non-clustered indexes on the view.
文章来源:
http://sohu2000000.spaces.live.com/Blog/cns!87FC8F72BEB4FD03!423.entry
posted @
2010-03-22 16:47 sohu2000000 阅读(107) |
评论 (0) |
编辑 收藏
ls 作用:列目录。
一般用法:
ls [选项] [文件]
常用参数:
-l,显示长列表,一般格式为: 属性列表 硬链接数 所有者 组名 大小 最后修改时间 文件名
drwxr-xr-x 13 root root 4096 2007-04-26 15:13 usr
属性列表中的后九个字符以三个为一组分表表示所有者、同组用户、其他用户,对此文件的操作权限,
分别为用'r'代表可读,'w'代表可写,'x'代表可执行,若对应用户无此权限,则使用'-'表示。
而属性列表第一个字符表示文件类型,可能有一下类型或更多:
-: 普通文件
d:目录文件
s:套接字文件
c:字符设备文件
p:管道文件
b:块设备文件
l:符号 链接
-a, 显示所有文件。在Linux中以'.'开头的文件是隐藏文件,ls的时候是不显示的,可以加上-a参数来显示隐藏文件。
-i, 显示文件的inode节点号。
--color:以不同颜色显示不同类型的文件。
命令示例:
ls --color -la 就是以长格式用彩色显示当前目录下所有文件。
其他:类似的dir命令一般也可用,但是它一般只是ls的一个完全相同的复制而已。如果不带参数,则仅仅列出当前目录下的所有非隐藏文件的名称。
cat 作用:显示指定文件的内容。
一般用法:cat [选项] [文件名]
常 用参数:
-v,除了LFD和TAB之外使用 ^ 和 M- 控制符显示非打印字符
-E,在每行结束处显示 $
-T,将制表符显示为 ^I
-e, 等价于 -vE
-t,等价于 -vT
-A,等价于 -vET
-b,对非空输出行编号
-n,对输出的所有行编号
-s,不输出连续的空行
命令示例:
cat -E abc.txt
将当前目录下的 abc.txt的内容显示到屏幕上,并且在每行末尾使用$表示。
cd 作用:改变目录。
一般用法:cd [path]
常用参数:无
命令示例:
cd /home/user 无论当前目录是什么都切换到/home/user下
cd user/abc 切换到当前目录下的user/abc目录中。
其他:如果无参数,会自动切换到当前用户的主目录,比如当前用户是user,一般就是/home /user目录,或者用'~'表示。
mkdir 作用:创建目录。
一般用法:mkdir [选项] [目录名]
常用参数:
-m:对新建的目录设置存取权限。
-p:递归执行,即要建立目录的父目录若不存在则先创建它的父目录。
命令示 例:mkdir -p /home/user/a/b/c
在/home/user/a/b下创建一个叫'c'的目录,如果路径中的某个目录不存在 则也创建它。
rmdir 作用:删除一个空目录。
一般用法:rmdir [选项] [目录名]
常用参数:
-p: 递归删除指定目录,当子目录删除后其父目录为空时,也一同被删除。如果整个路径被删除或者由于某种原因保留部分路径,则系统在标准输出上显示相应信息。
命令示例:rmdir c
删除当前路径中的名称为c的目录。
其他:此命令只删除空目录,即只包含'.'和'..'两个子目录而没有其他任 何文件的目录。rm -r可以代替rmdir命令,但是具有一定危险性。
touch 作用:创建一个空文件。
一般用法:touch [文件名]
常用参数:
命令示例:touch abc.txt
在当前目录下创建一个名为abc.txt的空文件。
rm 作用:删除文件
一般用法:rm [选项] [文件名]
常用参数:
-r:递归删除一个目录及其中的所有内容包括子目录和文 件。
-f:忽略不存在的文件,不提示。
-i:删除文件前提示。
命令示例:rm -rf abc
强制删除当前目录中的abc目录及其内容,若abc是文件此命令亦能执行。注意,此用法非常危险,如果失误,很难恢复!
其他:需要对目录有写权限。而且此命令属于危险命令,没有确认所有内容都不再需要时尽量不要使用,慎重再慎重!
mv 作用:移动目录树或给文件改名。
一般用法:mv [选项] [源文件] [目标文件]
常用参数:
-i:交互操作,覆盖前给出提示。
-f:禁止交互操作,无提示。
命令示例:mv ab c
将当前目录下的目录树移动到目录c下。如果ab是文件名或目录名,而c不是一个已经存在的目录,则将ab改名为c。
其他:需要有写权限,并且-f参数具有危险性,使用前请确认不会覆盖有用的文件。
cp 作用:复制文件。
一般用法:cp [选项] 源 目的
常用参数:
-a:全部复制。
-l:链接而不复制。
-H:使用符号链接的真正目的。
-i:覆盖文件前需要确认。
-s:只创建符号链接而不复制文件,类似ln -s。
-f:如果无法打开已存在的文件,会删除该文件并再尝试打开。
命令示例:
cp -a ~/b ~/c 将当前用户目录下的b中的所有内容复制到当前用户目录下的'c'目录中去。
其他:需要有写权限,并且-f参数具有危险性,使用前请确认不会覆盖有用的文件。
cp可以用来备份系统等,用法比较复杂,要详细理解需要认真阅读手册。
chmod 作用:改变文件的权限。
一般用法:chmod [选项] 模式 文件名
常用参数:
-R:递归更改所有文件及子目录。
-f: 去除大部分错误信息。
-v:显示详细的信息。
-c:类似于-v参数,但是只有在更改时才显示结果。
命令示例:
chmod 440 a.txt
更改当前目录下a.txt文件的权限为所有者和同组用户可读,但不能写和执行。其他用户对此文件没有任何权限。
chmod g-w a.txt
去除同组用户对a.txt的写权限。
其他:这个命令只有文件的所有者和root用户可以对文件使用,而且,root的权限始终和所有者相同。
另外,这个命令其实更关键的地方是权限的"模式","模式"有两种类型:
字母表示,很直观,对于少量的文件和个别权限的更改很合适,使用的格式为:
用户分类+权限(去除权限为-)。
表示用户分类的是:a表示all,u表示所有者,g表示同组用户,o表示其他用户;权限是:r表示读,w表示写,x表示执行。例如:a+x就是给所有用户执行权限。
也可以用八进制数表示用户权限,一位八进制数字表示一个用户的权限,用三位八进制数分别表示所有者,同组用户和其他拥用户的权限。规则为:
r w x
1 1 1
对应位为1则有此权限,0则没有。比如:640就表示所有者权限为6对应的二进制数为110,所有者权限即为rw-,同组的用户权限为4,二进制为 100,权限为r--,其他用户没有任何权限。
chown 作用:更改文件的所有者
一般用法:chown [选项] 用户名 文件名
常用参数:
-R:递归更改所有文件及子目
文章来源:
http://sohu2000000.spaces.live.com/Blog/cns!87FC8F72BEB4FD03!421.entry
posted @
2010-03-22 15:24 sohu2000000 阅读(97) |
评论 (0) |
编辑 收藏
作为计算机领域的从业者,能够聆听大师们的教诲,实在非常幸运的事啊。
(诚然在这101条语录中,并非每一条都是很经典的,但这不会掩饰住其中瑰宝的光芒。)
People always fear change. People feared electricity when it was invented, didn't they? People feared coal, they feared gas-powered engines. There will always be ignorance, and ignorance leads to fear. But with time, people will come to accept their silicon masters."
As Bill Gates once warned, computers have indeed become our silicon masters, pervading nearly every aspect of our modern lives. As a result, some of the greatest minds of our time have pondered the significance of computers and software on the human condition. Following are 101 great quotes about computers, with an emphasis on programming, since after all this is a software development site.
Computers
- "Computers are useless. They can only give you answers."
(Pablo Picasso)
- "Computers are like bikinis. They save people a lot of guesswork."
(Sam Ewing)
- "They have computers, and they may have other weapons of mass destruction."
(Janet Reno)
- "That's what's cool about working with computers. They don't argue, they remember everything, and they don't drink all your beer."
(Paul Leary)
"If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside."
(Robert X. Cringely)
Computer Intelligence
- "Computers are getting smarter all the time. Scientists tell us that soon they will be able to talk to us. (And by 'they', I mean 'computers'. I doubt scientists will ever be able to talk to us.)"
(Dave Barry)
- "I've noticed lately that the paranoid fear of computers becoming intelligent and taking over the world has almost entirely disappeared from the common culture. Near as I can tell, this coincides with the release of MS-DOS."
(Larry DeLuca)
- "The question of whether computers can think is like the question of whether submarines can swim."
(Edsger W. Dijkstra)
"It's ridiculous to live 100 years and only be able to remember 30 million bytes. You know, less than a compact disc. The human condition is really becoming more obsolete every minute."
(Marvin Minsky)
Trust
- "The city's central computer told you? R2D2, you know better than to trust a strange computer!"
(C3PO)
"Never trust a computer you can't throw out a window."
(Steve Wozniak)
Hardware
"Hardware: The parts of a computer system that can be kicked."
(Jeff Pesis)
Software
- "Most software today is very much like an Egyptian pyramid with millions of bricks piled on top of each other, with no structural integrity, but just done by brute force and thousands of slaves."
(Alan Kay)
"I've finally learned what 'upward compatible' means. It means we get to keep all our old mistakes."
(Dennie van Tassel)
Operating Systems
- "There are two major products that come out of Berkeley: LSD and UNIX. We don't believe this to be a coincidence."
(Jeremy S. Anderson)
- "19 Jan 2038 at 3:14:07 AM"
(End of the word according to Unix–2^32 seconds after January 1, 1970)
- "Every operating system out there is about equal… We all suck."
(Microsoft senior vice president Brian Valentine describing the state of the art in OS security, 2003)
"Microsoft has a new version out, Windows XP, which according to everybody is the 'most reliable Windows ever.' To me, this is like saying that asparagus is 'the most articulate vegetable ever.' "
(Dave Barry)
Internet
- "The Internet? Is that thing still around?"
(Homer Simpson)
- "The Web is like a dominatrix. Everywhere I turn, I see little buttons ordering me to Submit."
(Nytwind)
"Come to think of it, there are already a million monkeys on a million typewriters, and Usenet is nothing like Shakespeare."
(Blair Houghton)
Software Industry
- "The most amazing achievement of the computer software industry is its continuing cancellation of the steady and staggering gains made by the computer hardware industry."
(Henry Petroski)
- "True innovation often comes from the small startup who is lean enough to launch a market but lacks the heft to own it."
(Timm Martin)
- "It has been said that the great scientific disciplines are examples of giants standing on the shoulders of other giants. It has also been said that the software industry is an example of midgets standing on the toes of other midgets."
(Alan Cooper)
- "It is not about bits, bytes and protocols, but profits, losses and margins."
(Lou Gerstner)
"We are Microsoft. Resistance Is Futile. You Will Be Assimilated."
(Bumper sticker)
Software Demos
"No matter how slick the demo is in rehearsal, when you do it in front of a live audience, the probability of a flawless presentation is inversely proportional to the number of people watching, raised to the power of the amount of money involved."
(Mark Gibbs)
Software Patents
"The bulk of all patents are crap. Spending time reading them is stupid. It's up to the patent owner to do so, and to enforce them."
(Linus Torvalds)
Complexity
- "Controlling complexity is the essence of computer programming."
(Brian Kernigan)
- "Complexity kills. It sucks the life out of developers, it makes products difficult to plan, build and test, it introduces security challenges, and it causes end-user and administrator frustration."
(Ray Ozzie)
- "There are two ways of constructing a software design. One way is to make it so simple that there are obviously no deficiencies. And the other way is to make it so complicated that there are no obvious deficiencies."
(C.A.R. Hoare)
"The function of good software is to make the complex appear to be simple."
(Grady Booch)
Ease of Use
- "Just remember: you're not a 'dummy,' no matter what those computer books claim. The real dummies are the people who–though technically expert–couldn't design hardware and software that's usable by normal consumers if their lives depended upon it."
(Walter Mossberg)
- "Software suppliers are trying to make their software packages more 'user-friendly'… Their best approach so far has been to take all the old brochures and stamp the words 'user-friendly' on the cover."
(Bill Gates)
"There's an old story about the person who wished his computer were as easy to use as his telephone. That wish has come true, since I no longer know how to use my telephone."
(Bjarne Stroustrup)
Users
- "Any fool can use a computer. Many do."
(Ted Nelson)
"There are only two industries that refer to their customers as 'users'."
(Edward Tufte)
Programmers
- "Programmers are in a race with the Universe to create bigger and better idiot-proof programs, while the Universe is trying to create bigger and better idiots. So far the Universe is winning."
(Rich Cook)
- "Most of you are familiar with the virtues of a programmer. There are three, of course: laziness, impatience, and hubris."
(Larry Wall)
- "The trouble with programmers is that you can never tell what a programmer is doing until it's too late."
(Seymour Cray)
- "That's the thing about people who think they hate computers. What they really hate is lousy programmers."
(Larry Niven)
- "For a long time it puzzled me how something so expensive, so leading edge, could be so useless. And then it occurred to me that a computer is a stupid machine with the ability to do incredibly smart things, while computer programmers are smart people with the ability to do incredibly stupid things. They are, in short, a perfect match."
(Bill Bryson)
- "Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter."
(Eric Raymond)
- "A programmer is a person who passes as an exacting expert on the basis of being able to turn out, after innumerable punching, an infinite series of incomprehensive answers calculated with micrometric precisions from vague assumptions based on debatable figures taken from inconclusive documents and carried out on instruments of problematical accuracy by persons of dubious reliability and questionable mentality for the avowed purpose of annoying and confounding a hopelessly defenseless department that was unfortunate enough to ask for the information in the first place."
(IEEE Grid newsmagazine)
- "A hacker on a roll may be able to produce–in a period of a few months–something that a small development group (say, 7-8 people) would have a hard time getting together over a year. IBM used to report that certain programmers might be as much as 100 times as productive as other workers, or more."
(Peter Seebach)
- "The best programmers are not marginally better than merely good ones. They are an order-of-magnitude better, measured by whatever standard: conceptual creativity, speed, ingenuity of design, or problem-solving ability."
(Randall E. Stross)
"A great lathe operator commands several times the wage of an average lathe operator, but a great writer of software code is worth 10,000 times the price of an average software writer."
(Bill Gates)
Programming
- "Don't worry if it doesn't work right. If everything did, you'd be out of a job."
(Mosher's Law of Software Engineering)
- "Measuring programming progress by lines of code is like measuring aircraft building progress by weight."
(Bill Gates)
- "Writing code has a place in the human hierarchy worth somewhere above grave robbing and beneath managing."
(Gerald Weinberg)
- "First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack."
(George Carrette)
- "First, solve the problem. Then, write the code."
(John Johnson)
- "Optimism is an occupational hazard of programming; feedback is the treatment."
(Kent Beck)
- "To iterate is human, to recurse divine."
(L. Peter Deutsch)
- "The best thing about a boolean is even if you are wrong, you are only off by a bit."
(Anonymous)
"Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration."
(Stan Kelly-Bootle)
Programming Languages
- "There are only two kinds of programming languages: those people always bitch about and those nobody uses."
(Bjarne Stroustrup)
- "PHP is a minor evil perpetrated and created by incompetent amateurs, whereas Perl is a great and insidious evil perpetrated by skilled but perverted professionals."
(Jon Ribbens)
- "The use of COBOL cripples the mind; its teaching should therefore be regarded as a criminal offense."
(E.W. Dijkstra)
- "It is practically impossible to teach good programming style to students that have had prior exposure to BASIC. As potential programmers, they are mentally mutilated beyond hope of regeneration."
(E. W. Dijkstra)
- "I think Microsoft named .Net so it wouldn't show up in a Unix directory listing."
(Oktal)
- "There is no programming language–no matter how structured–that will prevent programmers from making bad programs."
(Larry Flon)
"Computer language design is just like a stroll in the park. Jurassic Park, that is."
(Larry Wall)
C/C++
- "Fifty years of programming language research, and we end up with C++?"
(Richard A. O'Keefe)
- "Writing in C or C++ is like running a chain saw with all the safety guards removed."
(Bob Gray)
- "In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg."
(Bjarne Stroustrup)
- "C++ : Where friends have access to your private members."
(Gavin Russell Baker)
"One of the main causes of the fall of the Roman Empire was that–lacking zero–they had no way to indicate successful termination of their C programs."
(Robert Firth)
Java
- "Java is, in many ways, C++–."
(Michael Feldman)
- "Saying that Java is nice because it works on all OSes is like saying that anal sex is nice because it works on all genders."
(Alanna)
- "Fine, Java MIGHT be a good example of what a programming language should be like. But Java applications are good examples of what applications SHOULDN'T be like."
(pixadel)
"If Java had true garbage collection, most programs would delete themselves upon execution."
(Robert Sewell)
Open Source
- "Software is like sex: It's better when it's free."
(Linus Torvalds)
"The only people who have anything to fear from free software are those whose products are worth even less."
(David Emery)
Code
- "Good code is its own best documentation."
(Steve McConnell)
- "Any code of your own that you haven't looked at for six or more months might as well have been written by someone else."
(Eagleson's Law)
"The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time."
(Tom Cargill)
Software Development
- "Good programmers use their brains, but good guidelines save us having to think out every case."
(Francis Glassborow)
- "In software, we rarely have meaningful requirements. Even if we do, the only measure of success that matters is whether our solution solves the customer's shifting idea of what their problem is."
(Jeff Atwood)
- "Considering the current sad state of our computer programs, software development is clearly still a black art, and cannot yet be called an engineering discipline."
(Bill Clinton)
"You can't have great software without a great team, and most software teams behave like dysfunctional families."
(Jim McCarthy)
Debugging
- "As soon as we started programming, we found to our surprise that it wasn't as easy to get programs right as we had thought. Debugging had to be discovered. I can remember the exact instant when I realized that a large part of my life from then on was going to be spent in finding mistakes in my own programs."
(Maurice Wilkes discovers debugging, 1949)
- "Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are–by definition–not smart enough to debug it."
(Brian Kernighan)
"If debugging is the process of removing bugs, then programming must be the process of putting them in."
(Edsger W. Dijkstra)
Quality
- "I don't care if it works on your machine! We are not shipping your machine!"
(Vidiu Platon)
- "Programming is like sex: one mistake and you're providing support for a lifetime."
(Michael Sinz)
- "There are two ways to write error-free programs; only the third one works."
(Alan J. Perlis)
- "You can either have software quality or you can have pointer arithmetic, but you cannot have both at the same time."
(Bertrand Meyer)
- "If McDonalds were run like a software company, one out of every hundred Big Macs would give you food poisoning, and the response would be, 'We're sorry, here's a coupon for two more.' "
(Mark Minasi)
- "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
(Martin Golding)
- "To err is human, but to really foul things up you need a computer."
(Paul Ehrlich)
"A computer lets you make more mistakes faster than any invention in human history–with the possible exceptions of handguns and tequila."
(Mitch Radcliffe)
Predictions
- "Everything that can be invented has been invented."
(Charles H. Duell, Commissioner, U.S. Office of Patents, 1899)
- "I think there's a world market for about 5 computers."
(Thomas J. Watson, Chairman of the Board, IBM, circa 1948)
- "It would appear that we have reached the limits of what it is possible to achieve with computer technology, although one should be careful with such statements, as they tend to sound pretty silly in 5 years."
(John Von Neumann, circa 1949)
- "But what is it good for?"
(Engineer at the Advanced Computing Systems Division of IBM, commenting on the microchip, 1968)
- "There is no reason for any individual to have a computer in his home."
(Ken Olson, President, Digital Equipment Corporation, 1977)
- "640K ought to be enough for anybody."
(Bill Gates, 1981)
- "Windows NT addresses 2 Gigabytes of RAM, which is more than any application will ever need."
(Microsoft, on the development of Windows NT, 1992)
- "We will never become a truly paper-less society until the Palm Pilot folks come out with WipeMe 1.0."
(Andy Pierson)
"If it keeps up, man will atrophy all his limbs but the push-button finger."
(Frank Lloyd Wright)
文章来源:
http://sohu2000000.spaces.live.com/Blog/cns!87FC8F72BEB4FD03!420.entry
posted @
2010-03-22 13:07 sohu2000000 阅读(318) |
评论 (0) |
编辑 收藏
This tip outlines two simple methods that help you to convert a number from the "little-endian" format to the "big-endian" format.
// 2-byte number
int SHORT_little_endian_TO_big_endian(int i)
{
return ((i>>8)&0xff)+((i << 8)&0xff00);
}
// 4-byte number
int INT_little_endian_TO_big_endian(int i)
{
return((i&0xff)<<24)+((i&0xff00)<<8)+((i&0xff0000)>>8)+((i>>24)&0xff);
}
文章来源:
http://sohu2000000.spaces.live.com/Blog/cns!87FC8F72BEB4FD03!419.entry
posted @
2010-03-22 10:37 sohu2000000 阅读(320) |
评论 (0) |
编辑 收藏
字符串
知识点checklist
strlen()函数的返回值是什么类型的?
//size_t类型
字符串strlen()的值,是否和他占据的内存空间相同?
//不,strlen不计算NUL
你是否知道strcpy函数存在的潜在风险?如何避免?
//strcpy假设目标拥有足够的空间,并且空间是可写的。保证目标有足够的空间并且可写就可以。
如果一个字符串没有字符串结束符,而调用str开头的库函数,会发生什么?
//会把从开头到遇到的第一个NUL当作字符串
Strcpy(),strcat(),strcmp(),strncpy(),strncat(),strncmp()内部到底是如何运行的?这些函数到底对源字符串和目标字符串做了些什么?你是否观察过它们运行时两个字符串内存的变化?
//这个只能说知道了,并且看过源代码,就不把代码写出来了。
上面这些函数使用时,各有哪些需要注意的地方?
//cpy,ncpy和cat,ncat要保证空间足够,所有的都要保证有NUL结束符。
你会几种字符串查找操作?
//strstr,strchr等等?
// STL 中的 search 模板等等
c语言中有字符串这个数据类型吗?
//没有,只有类似的字符数组和字符指针
对字符串进行操作的时候,是否为字符串结尾符预留存储位置?
//NULL的作用相当于截断符
// 不然的话容易造成非常访问内存。
// 当然要预留,并且如果没有的话,最后要补上。
数组
学习时间:2W
知识点checklist
你肯定知道,定义"int a[10];",a[10]这个元素是无效的。
//恩,最大到a[9]
你知道几种数组初始化的方法?
//{}这种初始化方法,char类型数组还可以用一个字符串字面值来初始化
数组和指针有千丝万缕的联系而又不同,你是否对他们在不同情况下的使用进行过详细的总结?
//进行过详细的总结。C专家编程对此有详细说明,我就写了。
"int calendar[10][20];",这是一个什么样的数组?它拥有10数组类型的元素,还是20个?
//calendar是一个数组的数组,但我们直接称呼它为多维数组。有10个元素。
"int a[10];",数组名a在本质上是一个什么?你是否打印过a的值?
//第一个元素的地址。打印过。
你知道几种获取数组某元素的方法?
//[]来获取,指针来获取。
指针和数组相同吗?什么时候相同?什么时候不同?
//不相同。在函数传参的时候相同,其他地方不同。
用指针和下标访问数组元素,那种方式更快?
//指针,但也不一定。详细参见C专家编程。
结构体
学习时间:1W
知识点checklist
你知道什么是位域结构体吗?如何定义它?如何使用它?
//知道,在结构体的元素后面加上:在加位大小。
你知道字节对齐对结构体占用内存空间大小的影响吗?如何计算结构体占用内存的大小?
//知道,sizeof(struct tag)进行计算
宏
学习时间:1W
知识点checklist
你知道宏的本质是什么吗?函数?语句?类型定义?或者其他?
//文字替代
你知道语言设计者为什么设计宏吗?这些原因目前是否仍然成立?
//使用宏,可以使得算法更加快速的完成
// 知道。宏仍然有很大的作用。
你会设计带有参数的宏吗?
//会
你知道使用宏的参数的的时候的注意事项吗?
//注意打上()
你会设计带有可变参数的宏吗?
//会,详见C99标准
你知道使用宏有什么劣势吗?
//目标码膨胀; 简单文艺;指向时快速
你有没有更好的替代方案?
//内联函数
枚举
学习时间:0.5W
知识点checklist
是否可以指定枚举中各项的值?//可以,利用这点,可以在CPP代码中定义
如果不指定值,枚举的第一个值是多少?//0
枚举的值是否可以是负数?//可以
定义枚举的时候,你是否专门定义了枚举的最小值和最大值?//基本没有……
Switch
学习时间:0.5W
知识点checklist
switch(c)中的c的数据类型有哪些?//能与int兼容的类型
你是否在所有的switch中都加了default语句?//是的
是否在所有的case中都加了break语句(一般情况的做法)?如果你不加break,将会发生什么?//加了。不加的话继续向下个case执行。
Static
学习时间:1W
知识点checklist
static的三个主要作用是什么?//把作用域定义为文件内,把变量定义为静态变量,还有一个是什么?
static的修饰的局部变量是保存在什么地方的?全局变量哪?//数据段内
static修饰的全局变量和函数,在其他的文件中是否可以访问?如何访问?//不可以吧
你知道static是c语言中实现封装和隐藏的利器吗?你是否经常使用?//知道,但不常用
定义在不同源文件中的static全局变量,编译器是否允许他们的变量名称相同?他们在内存中的地址是否相同?函数那?//允许。不同。不同
const
学习时间:1W
知识点checklist
你是否经常使用const来表明不能够被更改的变量?//是的
你是否经常使用const常量来代替宏?//是的
下面四种情况,你知道是各表示什么意思吗?
int i_value= 10;
//变量i_value
const
int* pvalue = &i_value
//指向const int的变量pvalue
// pvalue 是指向常量或者恒量的int类型的指针
int
const *pvalue = &i_valueint* const pvalue= &i_value//这行是不是有点错误
const
int* const pvalue = &i_value//指向const int的const指针变量
你知道const常量如何初始化吗?//在定义时加上=
Sizeof
学习时间:1W
知识点checklist
对于字符数组,strlen和sizeof的值是否相同?
//不一定
// strlen计算的时候,不计算'\0'
// sizeof
Sizeof本质上是函数还是宏?
//应该被称作编译器函数
// 是一种运算符
Sizeof的返回值是什么类型?//size_t类型
指针
学习时间:3W
知识点checklist
"int *p;"&p,p,*p他们的值分别表示什么含义?//&p表示指针变量的地址,p表示指针变量的值,*p表示指针变量的值的内存单元的值
你定义的指针初始化了没?//初始化了
你理解指针的指针的概念吗?你会使用吗?//理解,会使用
"int *pi_value; pi_value = 0x100000;" pi_value + 1的值是是多少?//0x100000+1*sizeof(int),要根据编译器的int大小了
你会定义函数指针吗?//会,比如void (*f)()
你会使用函数指针调用函数吗?//会,并且有两种方法。
关于指针和数组,请参见知识点数组。
动态分配内存
学习时间:1W
知识点checklist
动态分配的内存是保存在什么地方的?//堆
什么情况下使用动态分配内存?//需要的内存大小由运行时决定的
动态申请内存一定要释放,否则会内存泄露。你是否使用过内存检测工具?//使用过。
函数
学习时间:1W
知识点checklist
如何查看函数在内存中的地址?//函数名就是地址
如何给一个函数指针赋值?//&函数名
你是否会定义可变入参函数//会,使用stdarg.h
你是否可以区分函数的形参与实参?//当然
如何定义函数名,以准确的表达函数的用途?//我比较喜欢用下划线来写出一个完整的短语。比如set_screen
你是否使用const来修饰函数入参和返回值,以表的特定的含义?//如果有需求的话会使用。
递归如何使用?//在函数中调用自己就是递归了,不过要注意终止条件
变量
学习时间:1W
知识点checklist
全局变量,局部变量,常量分别保存在内存中的什么地方?//全局变量在全局区,局部变量在堆栈,常量在常量区
不同类型的变量,你是否知道其作用域?//当然知道
全局变量和局部变量是否可以重名?你是否在这样做?//可以,没有
局部变量在函数退出后是否有效,为什么?//无效,堆栈被清空了
全局变量为什么不允许定义在头文件中?有何危害?//容易被重复定义
链接(linux)
学习时间:1W
知识点checklist
链接位于编译过程的那个阶段?//当然是链接阶段
动态链接库和静态链接库使用时有何区别?//静态链接库是把库包含在文件里面,动态链接库则动态的链接
如何对动态链接库进行动态加载(不用重启程序而加载链接库)?//Linux不是启动时加载吗?……
动态链接有何优点?//节省空间,获得ABI的好处,不必应函数库和操作系统的更新而重新链接程序
动态链接库中是否定义了非static的全局变量?你是否知道这是一个非常危险的动作?//没有,知道
动态库中的全局变量(非static)和函数(非static)是否可以和上层全局变量和函数重名?重名后会发生什么事情?//这个不知道……
运行时的数据结构(linux)
学习时间:1W
知识点checklist
你知道什么是段的概念吗?//知道
可执行程序可以分为几个段?每个段保存的是什么内容?//数据段,bss段,text段。数据段保存全局数据,bss段保存未初始化的全局数据,text保存代码
如何查看可执行程序各个段的大小?//size命令
当函数被调用时发生了什么?//设置活动过程记录,然后跳转?
你有没有试过程序的栈空间最大有多大?程序超过此大小会发生什么?//有,栈溢出
你使用的系统的栈是向下生长的,还是向上生长的?//向下
Include
学习时间:0.5W
知识点checklist
1、如何避免对同一头文件的多次include?
//
// #ifndef,
// #define,
// #endif
// 控制
声明
学习时间:1W
知识点checklist
文章来源:
http://sohu2000000.spaces.live.com/Blog/cns!87FC8F72BEB4FD03!418.entry
posted @
2010-03-22 01:15 sohu2000000 阅读(364) |
评论 (0) |
编辑 收藏
1.吃了辣的东西,感觉就要被辣死了,就往嘴里放上少许盐,含一下,吐掉,漱下口,就不辣了;
2.牙齿黄,可以把花生嚼碎后含在嘴里,并刷牙三分钟,很有效;
3.若有小面积皮肤损伤或者烧伤、烫伤,抹上少许牙膏,可立即止血止痛;
4.经常装茶的杯子里面留下难看的茶渍,用牙膏洗之,非常干净;
5.仰头点眼药水时微微张嘴,这样眼睛就不会乱眨了;
6.嘴里有溃疡,就用维生素C贴在溃疡处,等它溶化后溃疡基本就好了;
7.眼睛进了小灰尘,闭上眼睛用力咳嗽几下,灰尘就会自己出来;
8.洗完脸后,用手指沾些细盐在鼻头两侧轻轻按摩,然后再用清水冲洗,黑头和粉刺就会清除干净,毛细孔也会变小;
9.刚刚被蚊子咬完时,涂上肥皂就不会痒了;
10.如果嗓子、牙龈发炎了,在晚上把西瓜切成小块,沾着盐吃,记得一定要是晚上,当时症状就会减轻,第二天就好了;
11.吹风机对着标签吹,等吹到商标的胶热了,就可以很容易的把标签撕下来;
12.旅行带衣服时如果怕压起褶皱,可以把每件衣服都卷成卷;
13.打打嗝时就喝点醋,立杆见影;
14.吃了有异味的东西,如大蒜、臭豆腐,吃几颗花生米就好了;
15.治疗咳嗽,特别是干咳,晚上睡觉前,用纯芝麻香油煎鸡蛋,油放稍多些,什么调味料都不要放,趁热吃过就去睡觉,连吃几天效果很明显;
16.手腕长粗的MM想带较细的手镯,就不能硬带,应把手上套上一个塑料袋再带上手镯,非常好带,也不会把手弄疼,取下也是同样的方法;
17.栗子皮难剥,先把外壳剥掉,再把它放进微波炉转一下,拿出后趁热一搓,皮就掉了;
18.插花时,在水里滴上一滴洗洁精,可以维持好几天;
19.把核桃放进锅里蒸十分钟,取出放在凉水里再砸开,就能取出完整的桃核仁了;
20.把虾仁放进碗里,加一点精盐、食用碱粉,用手抓搓一会儿后用清水浸泡,然后再用清水冲洗,即能使炒出的虾仁透明如水晶,爽嫩可口;
21.炒肉时,先把肉用小苏打水浸泡十几分钟,倒掉水,再入味,炒出来会很嫩滑;
22.将残茶叶浸入水中数天后,浇在植物根部,可促进植物生长;
23.把残茶叶晒干,放到厕所或者沟渠里燃熏,可消除恶臭,具有驱除蚊子苍蝇的功能;
24.夹生饭重煮法:可用筷子在饭内扎些直通锅底的孔,洒入少许黄酒重焖,
25.若只表面夹生,只要将表层翻到中间再焖即可;
26.巧除纱窗油腻:将洗衣服、吸烟剩下的烟头一起放在水里,待溶解后,拿来擦玻璃窗、纱窗,效果真不错;
27.只要在珠宝盒中放上一节小小的粉笔,即可让首饰常保光泽;
28.桌子、瓶子表面的不干胶痕迹用风油精可以擦拭;
29.出门时随时在包里带一节小的干电池,若裙子带静电,就把电池的正极在裙子上面擦几下即可去掉静电;
30.不管是鞋子的哪个地方磨到了你的脚,你就在鞋子磨脚的地方涂一点点白酒,保证就不磨脚了;
31.亨调蔬菜时,如果必须要焯,焯好菜的水最好尽量利用。如做水饺的菜,焯好的水可适量放在肉馅里,这样既保证营养,又使水饺馅味美有汤;
32.夏天足部容易出汗,每天用淡盐水泡脚可有效应对汗脚;
33.夏天游泳后晒晒太阳,可防肌肤劳损等疾病发生;
34.夏天枕头易受潮滋生霉菌,时常曝晒枕芯有利健康;
35.多吃薏米小豆粥等潮湿健脾,可防暑湿;
36.防失眠:睡前少讲太多话,忌饮浓茶,睡前勿大用脑,可用热水加醋洗脚;
37.金银花有疏散风湿功效,金银花水煎取汁凉后与蜂蜜冲调可解暑;
38.吃过于肥腻的食物后喝茶,能刺激自律神经,促进脂肪代谢;
39.睡眠不足会变笨,一天需要睡眠八小时,有午睡习惯可延缓衰老;
40.双手易变得干燥粗糙,用醋泡手十分钟可护肤;
41.夏天擦拭凉席,用滴加了花露水的清水擦拭凉席,可使凉席保持清爽洁净。当然,擦拭时最好沿着凉席纹路进行,以便花露水渗透到凉席的纹路缝隙,这样清凉舒适的感觉会更持久;
42.早餐多食西红柿、柠檬酸等酸性蔬菜和水果,有益于养肝;
43.爽身止痒洗头或洗澡时,在水中加五六滴花露水,能起到很好的清凉除菌、祛痱止痒作用;
44.葡萄含有睡眠辅助激素,常食有助睡眠;
45.夏天多喝番茄汤既可获得养料,又能补充水分,番茄汤应烧好并冷却后再喝,所含番茄红素有一定的抗前列腺癌和保护心肌的功效,最适合于男子;吃酸性物质马上刷牙会损害牙齿健康;
46.因外伤碰破皮肉时,在伤处涂上牙膏进行消炎、止血,再包扎,作为临时急救药,以药物牙膏效果最为显著;
47.将白醋喷洒在菜板上,放上半小时后再洗,不但能杀菌,还能除味;
48.喝酸奶能解酒后烦躁,酸奶能保护胃黏膜、延缓酒精吸收,并且含钙丰富,对缓解酒后烦躁尤其有效;
49.皮鞋包皮放久了发霉时,可用软布蘸酒精加水(1:1)溶液擦拭即可;
50.发生头痛、头晕时,可在太阳穴涂上牙膏,因为牙膏含有薄荷脑、丁香油可镇痛;
51.蜡烛冷冻二十四小时后,再插到生日蛋糕上,点燃时不会流下烛油;
52.白色衣裤洗后易泛黄,可取一盆清水,滴上二三滴蓝墨水,将洗过的衣裤在浸泡一刻钟,不必拧干,就放在太阳下晒,即可洁白干净;
53.过多食用生葱蒜会刺激口腔肠胃,不利健康,最好加一点醋再食用;
54.及时补充水分但应少喝果汁、可乐、雪碧、汽水等饮料,含有较多的糖精和电解质,喝多了会对肠胃产生不良刺激,影响消化和食欲。因此夏天应多喝白开水或淡盐(糖)水;
55.每天早晨用豆腐摩擦面部几分钟,坚持一个月,面部会变得很滋润;
56.空调室内温差不宜超过五度,即使天气再热,空调室内温度也不宜到24度以下;
57.加酶洗衣粉剂放在温水中需要较长的分解时间才能使洗衣效果更佳;
58.夏天,人的活动时间变长,出汗多,耗能过大,应适当多吃鸡、鸭、瘦肉、鱼类、蛋类等营养食品,以满足人体的代谢需要;
59.头痛时把苹果磨成泥状涂在纱布上,贴在头痛处,症状可减轻;
60.皮包上有污渍,可以用棉花蘸风油精擦拭。
文章来源:
http://sohu2000000.spaces.live.com/Blog/cns!87FC8F72BEB4FD03!417.entry
posted @
2010-03-21 22:29 sohu2000000 阅读(118) |
评论 (0) |
编辑 收藏
如果你想进入Linux神奇的网络编程世界,请跟笔者来,在学习之前,笔者只需要你拥有一定的C语言编程知识,就足够了。笔者会讲述编写网络程序需要的基本知识。
所谓网络,在软件人员的观点来看,就是很多的用物理链路(比如,以太网,无线网络)连在一起的计算机,并且安装有网络程序。就像打电话,我们需要知道对方的号码一样,网络程序也需要知道要和那台计算机通讯,在这里,就是计算机的网络接口所拥有的IP地址。
其实,一个完整的网络程序拥有两个独立的程序,他们分别运行在两个计算机上,一个是网络通讯的服务器端,一个是网络通讯的客户端,就像打电话,需要一个打电话的,还要一个接电话的是一样的,所以,我们需要编写两个程序,才是完整的网络通讯程序,我们熟悉的OutLook,FOXMAIL等都是网络程序中的客户端程序,而Apache,QMail等便是 服务器端程序。只是往往,网络程序的客户端和服务器端之间有一定的通讯交互协议,比如SMTP,POP3,HTTP,FTP等,对于我们网络程序的编写者来说,他们就规定了通用的交互协议,这些协议规定了客户端,服务器端应该完成的工作,所以,编写好网络程序还需要理解好协议,不过,一般说来,我们用不着自己写协议,有很多的协议,我们可以使用的,都有RFC文档来说明了,你可以在网络上找到各种协议的RFC.
当然,我们现在将要开始编写的第一个网络程序,虽然非常简单,但是却可以很清楚的说明大部分编写网络程序需要的基本概念,好了先让我们看看网络程序的 TCP服务器端的编写步骤:
1. 首先,你需要创建一个用于通讯的套接口,一般使用socket调用来实现。这等于你有了一个用于通讯的电话:)
2. 然后,你需要给你的套接口设定端口,相当于,你有了电话号码。这一步一般通过设置网络套接口地址和调用bind函数来实现。
3. 调用listen函数使你的套接口成为一个监听套接字。 以上三个步骤是TCP服务器的常用步骤。
4. 调用accept函数来启动你的套接字,这时你的程序就可以等待客户端的连接了。
5. 处理客户端的连接请求。
6. 终止连接。
现在让我们来看看网络程序客户端的编程步骤:
1. 和服务器的步骤一样。
2. 通过设置套接口地址结构,我们说明,客户端要与之通讯的服务器的IP地址和端口。
3. 调用connect函数来连接服务器。
4. 发送或者接收数据,一般使用send和recv函数调用来实现。
5. 终止连接。
以上的步骤,是比较普遍的,我们可以从中看出,编写网络程序是很有意思的,同时,也不是非常复杂,当然,这不包括,高难度的东西:-),下次,我会给出一个简单的服务器和一个客户机程序。
今天,我给出的代码包括一个服务器和一个客户机程序,但是省略了很多代码,比如说错误处理代码,这样做主要是为了使网络编程的主线清楚,所以,这两个程序谈不上网络安全性,和稳定性,这些是以后的话题。但是对于基本理解 网络编程已经足够了。我会在下次给出一个完整可运行的程序。下面我会详细解释程序的步骤:
先要包括一部分网络编程必须的头部文件:
#include
#include
#include
#include
int main(int argc,char *argv[])
{
int listensock,connsock; //定义两个socket套接字,一个用于监听,一个用于通讯
struct sockaddr_in serveraddr;/ /定义网络套接字地址结构
const char buff[] = "Hello! Welcome here!"; //定义要发送的数据缓冲区;
listensock = socket(AF_INET,SOCK_STREAM,0); //创建一个套接字,用于监听
bzero(&serveraddr,sizeof(servaddr)); //地址结构清零
serveraddr.sin_family = AF_INET; /指定使用的通讯协议族
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); //指定接受任何连接,因为服务器不知道谁会要求连接
serveraddr.sin_port = htons(5000); //指定监听的端口
bind(listensock,(sockaddr *)&serveraddr,sizeof(serveraddr)); //给套接口邦定地址
listen(listensock,1024); //开始监听
connsock = accept(listensock,(sockaddr *)NULL, NULL); //建立通讯的套接字,accept函数,等待客户端程序使用connect函数的连接
send(connsock,buff,sizeof(buff), 0); //向客户端发送数据
close(connsock); //关闭通讯套接字
close(listensock); /关闭监听套接字
}
这是客户端的程序:
int main(int argc,char **argv)
{
char recvbuff[100]; /定义要接收的数据缓冲区
int sockfd; /定义一个socket套接字,用于通讯
struct sockaddr_in serveraddr;/定义网络套接字地址结构
if(argc != 2){
printf("Usage: echo ip地址");
exit(0);
}
sockfd = socket(AF_INET,SOCK_STREAM,0);//创建一个套接字
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family = AF_INET; //指定使用的通讯协议族
serveraddr.sin_port = htons(5000);//指定要连接的服务器的端口
inet_pton(AF_INET, argv[1], &serveraddr.sin_addr);
connect(sockfd,(sockaddr *)&serveraddr,sizeof(serveraddr)); //连接服务器
recv(sockfd,recvbuff,sizeof(recvbuff),0); //接收服务器的数据
printf("%s",recvbuff); //打印接收到的数据
close(sockfd); //关闭套接字
}
这两个程序运行后,当客户端连接到服务器后,将接收到服务器传来的字符串Hello! Welcome here!,不过,程序调试的任务还得又你自己要完成。
你想知道著名的oicq使用的是什么技术来收发消息的吗?今天,我给出的两个程序,一个服务器 和一个客户端程序,便能告诉你,其中的基本技术,当然,我指的不包括,它的界面是怎样做的:)这两个程序使用的是UDP套接字编程,上一次给出的其实是使用TCP套接字编程,你自己可以先分析一下,他们的异同点,我会在下一次,分析这两种编程的区别。
这是发送数据的程序:
/*头部文件包括网络需要的和基本输入输出需要的*/
#include
#include
#include
#include
#include
int port = 5500;
void main()
{
int sockfd;
int count = 0;
int flag;
char buf[80];
Struct sockaddr_in address;
sockfd = socket(AF_INET, SOCK_DGRAM, 0); //看到不同的地方了吗?
// memset(&address, 0, sizeof(address));
bzero(&address, sizeof(address));
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = htons(port);
flag = 1;
do{
sprintf(buf,"Packet %d", count);
if(count > 30){
sprintf(buf,"over");
flag = 0;
}
sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&address, sizeof(address)); // 发现了吗使用的函数不一样,它也是发送数据
count++;
}while (flag);
}
这是接收数据的程序:
#include
#include
#include
#include
#include
char *hostname = "127.0.0.1"; //这个特殊的ip表示本的计算机
void main()
{
int sinlen;
int port = 8080;
char message[256];
int sockfd;
struct sockaddr_in sin;
struct hostent *server_host_name; // hostent结构有着机器的名字等信息
server_host_name = gethostbyname("127.0.0.1"); // 这个函数用来得到“127.0.0.1”的主机名字,也就是本机的名字
bzero(&sin,sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = htons(port);
sockfd = socket(PF_INET,SOCK_DGRAM,0); //这里也不一样
bind(sockfd,(struct sockaddr *)&sin,sizeof(sin));
while(1){
sinlen = sizeof(sin);
recvfrom(sockfd,message,256,0, (struct sockaddr *)&sin,&sinlen);// 它是接受数据的函数
printf("Data come from server:%s ",message);
if(strncmp(message,"over",4) ==0)
break;
}
close(sockfd);
}
当你编译调试通过了后,在一个窗口,运行接收程序,一个窗口运行发送程序,你就可以看到数据被创送了。网络程序是可以在本地机器上,使用两个不同的窗口来运行,模拟客户端和服务器的
今天,笔者会解释网络编程中非常重要的两个概念:TCP编程和UDP编程,这是真真进入网络编程的灿烂世界必须深入理解的部分。
首先,我们必须明白,一般操作系统包括Windows,Linux,UNIX,他们提供的供应用程序员使用的编程接口,一般的函数名字都差不多。不同的是,他们的操作系统对这些函数(也可以说是系统调用)的实现细节不尽相同,因此各种操作系统,在提供网络服务的时候,就存在着诸如速度、效率及稳定性的差别。
那么,就网络编程的套接口字的选则来看,一样存在着以上的差别。也就是说,你选择TCP套接字和选择UDP编程,在传输数据时,一样有着速度、效率及稳定性的差别。首先,明白这一点,对于开始网络编程是非常重要的。
TCP套接字,操作系统向你提供的是一个稳定的数据通路,从程序员的角度来看,你只需要明白,当你使用TCP编程时,如果你调用的发送数据函数,比如send()函数,它的返回成功,那么表示,系统发送出的数据肯定被通讯的对方准确接收到了。而UDP套接字,操作系统给你提供的是一个不稳定的,无连接的数据通路,所以当你使用UDP编程时,如果你调用的发送数据的函数,如sendto()函数,它的返回成功,那么表示,你要发送的数据已经发送到了网上,而这些数据是否到达了你要发送数据的对方,那时不一定的。所以对于UDP编程,我们如果要保证数据的发送的准确、及时,我们需要自己建立起,一些数据传送的控制机制,来确保我们的数据成功发送到对方,而不仅仅是把数据发送到了网络上,我们就不过问了。当然对于TCP编程,操作系统已经帮我们做了一系列控制功能,所以我们不需要考虑太多的东西;-)
从以上的分析,你应该可以看出,对于初学者或者说,TCP编程是非常好的入门点,也是很容易的。当然,UDP有它自己的好处,不过它虽然不能保证你调用一次发送函数就把数据发送到对方那里,但是只要你进行适当的处理,你会发现,UDP发送数据的速度,比TCP编程要快!天下没有十全十美的!
TCP编程拥有了可靠的数据连接,UDP不具有,但是在速度方面,UDP编程缺优于TCP编程,特别是对于传输短消息,所以我认为OICQ所以选择UDP编程,这个原因是其中很重要的一个^-^。
现在我已经说明了TCP和UDP编程的重要差别,虽然这些差别是由协议本身引入的,但是对于编程来说,理解了是很有好处的。
当然,那对于一个程序员来说还的明白,选择TCP编程,和UDP编程到底是怎样体现在代码上的,其实如果你仔细分析过我前面给出的两个程序,你也许已经明白,除了他们使用的发送数据和接收数据的函数不怎样一样之外,最重要的差别在于当你使用socket()函数建立套接字的时候,你需要的指定的三个参数中,中间的那个参数。如果你要使用TCP编程,你要使用SOCK_STREAM,而如果你要使用UDP编程,使 用SOCK_DGRAM,
服务器和客户机的概念和区别:
服务器/客户机模式是网络通讯交互的最常用模式,我们必须要深刻的理解这种交互模式。
其实,网络软件在很大程度上是对各种网络协议的实现,不管这种协议是官方的,还是你自己定义的。所以,网络软件的好坏也和协议的好坏有着直接的关系。 当然,服务器/客户机模式在某种程度上就规定了这样一种机制:
1. 服务器方的程序首先启动,开始等待。
2. 客户机的程序启动,向服务器提出通讯连接的请求。
3. 服务器决定是否接受客户机的连接请求。并且,给客户机一个回答。
4. 如果,服务器和客户机建立了连接,通常的协议,会给出那一方应该在这个时候首先发送数据,还有发送数据的内容,格式等等。
5. 这样,一方发送,另一方接受,然后回答。
服务器和客户机就是在这样的一来一往的情况下,进行通讯的,但是为什么要选择这种依次发送的顺序了,这些都是因为要解决,在网络上传输数据时,可能出现的死锁和饿死等现象。 对于这两种现象,我们可以这样理解,比如,我向你发了消息,等你的回答,然后才进行下一步,可是这时候,你可能也在等待我的数据到来,然后发回答给我,可是问题出现了,如果你没有得到我的消息(掉了包),那么我和你可能一直等待下去。当然,常用的各种协议,比如SMTP,POP3,FTP,WWW都很好的定义了发送和接收数据的顺序问题。这也是我们要很好理解的。刚才我说的那个例子,其实就是一种死锁,两方都不能继续通讯了。
至于饿死现象,我们可以这样想,一个服务器每次只能处理一个用户的通讯请求,那么当他和一个客户机通讯时,他接收了客户机的连接请求后,等待客户机的数据发送过来,可客户机的数据迟迟不到(可能失掉了,可能客户机更本没发送数据),这种情况下,服务器将不能和别的客户机通讯,资源都被这个客户机用了,那么对于其他的客户机用户,就处于一种饿死状态。
我们当然可以通过,规定很多的东西来保证我们通讯的顺利进行。比如一方发送,一方等待。 发送方在没有得到回答前重复多次发送数据。发送方还可以使用定时器等方法,来保证不出现饿死和死锁现象。如果你想学习更多的方法和思想,你可以学学TCP/IP协议和各种应用协议,他们在不同的层次上解决了各种可能遇到的问题。
当然,在网络上会出现的障碍是多种多样的,你所用的协议及你所写的代码,一起决定了你的网络程序的性能和安全。所以,现实生活中的网络程序往往是很复杂的.
文章来源:
http://sohu2000000.spaces.live.com/Blog/cns!87FC8F72BEB4FD03!416.entry
posted @
2010-03-21 22:27 sohu2000000 阅读(167) |
评论 (0) |
编辑 收藏