当前位置:  操作系统/服务器>linux
本页文章导读:
    ▪TCP/IP : 网络因此互联      对于中美两国而言,1972年无疑是一个具有特殊意义的年份。这一年2月21日,美国总统尼克松访华,20多年来中美关系的坚冰被打破,中美关系由此翻开了崭新的一页,世界战略格局因此发生了.........
    ▪Linux Shell编程语法      本文转自:http://www.cnblogs.com/fhefh/archive/2011/04/13/2014967.html在计划好要程序干什么以及如何使用程序的使用变得更加简单易学之后,程序员就必须以计算机能够理解的方式把他的想法记录下来,.........
    ▪Linux内核源码分析方法      Linux内核源码分析方法 一、内核源码之我见Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次。如果想透析Linux,深入操作系统的.........

[1]TCP/IP : 网络因此互联
    来源:    发布时间: 2013-10-22

对于中美两国而言,1972年无疑是一个具有特殊意义的年份。这一年2月21日,美国总统尼克松访华,20多年来中美关系的坚冰被打破,中美关系由此翻开了崭新的一页,世界战略格局因此发生了重大变化,而带来此次巨变的乒乓外交则成了世界外交史上的经典。

也是在这一年,25岁的电脑工程师诺兰·布什内尔(Nolan Bushnell)创立了世界上第一家电子游戏公司阿塔利(Atari)。在计算机世界尚处蛮荒的时代,阿塔利借助其著名的游戏《乒乓》让计算机不再只是技术天才的玩具,而变成了真正可以愉悦大众的商品。

大众市场对《乒乓》的热烈反响改变了随后科技世界中许多人和许多公司的命运。1976年愚人节,阿塔利公司员工史蒂夫·乔布斯创立了苹果公司(NASDAQ:AAPL),这家公司随后挽救了临近夕阳的消费电子产业,大众市场的伟大因此得以再度彰显。又过了10年,任天堂(7974.O)受阿塔利的影响将主营业务从扑克牌转向专业游戏机,从而接替后者续写了现代家用游戏机的神话。

这时的阿帕网则已经开始逐渐改变社会,它为军队、大学和许许多多的科研机构提供了此前无法想象的便利。但这时,军队的特殊背景却阻碍了这种积极影响在更广阔范围内的蔓延。于是,就像网络初期人们迫切希望利用军方的经费推动网络的发展一样,这时的人们更加强烈地希望互联网能够逐渐摆脱单纯军事工具的角色,而按照其自身的发展规律去发展。

于是,在鲍勃·卡恩(Bob Kabn)的组织下,首届国际计算机通信大会(International Computer Communication Conference,ICCC)于该年10月正式召开。在华盛顿希尔顿饭店的地下室里,卡恩向来自全球各地的30多位网络专家展示了阿帕网的运行效果,精神病人帕里(PARRY)甚至还通过计算机和他的主治医生讨论了病情,这一切都令全世界感到惊奇。

初具雏形的互联网就征服了参加这次大会的技术专家,他们一致认为有必要就高级联网技术进一步合作,国际互联网工作组(Inter Network Working Group,INWG)因此成立。由于主持演示的卡恩工作太忙,温顿·瑟夫(Vinton Cerf)走上前台成为INWG的首任主席。

现年69岁的瑟夫如今的身份是谷歌副总裁兼首席互联网布道师。与大多数默默无闻的开拓者相比,瑟夫无疑相当幸运:尽管坚称“互联网的成功是千百人共同努力的结果”,而自己“只是在互联网诞生的最初几年做了一些工作”,但瑟夫依然被广泛视为“互联网之父”。

对天才这一名词的使用已经近乎泛滥,但无论我们对这个词汇进行怎样严格的界定,瑟夫都不应被排除在外。与很多已经相当杰出的人才相比,瑟夫在天才的道路上走得无疑更远。他不仅是一位优秀的科学家和工程师,而且还是一位对于世界拥有丰富感性认知的“文艺青年”。他对人性的理解颇为深刻,对现实的观察相当敏锐,对未来的想象甚至常常引人入胜。

对于瑟夫而言,惟一可以令其耿耿于怀的也许就是他的耳朵:早产让他年纪轻轻就丧失了大部分听力,这使他不得不与助听器终生为伴。但这仅有的缺点却为他带来了巨大的人生财富:1965年,瑟夫在一个助听器厂商组织的活动中与其后来的妻子一见钟情。瑟夫的妻子是一位插画家,她的听力甚至比瑟夫还差:早在3岁时,她就已经失去了几乎全部听力。

在那个特殊的年代,瑟夫将他性格中的所有特质结合起来,将互联网从一个专属政府的学术工具和军方的冷战工具变成了供全球使用的沟通平台以及最完美的创业栖息地。而所有这些目标的实现,都与一个今天的我们熟知却未必真正了解的概念息息相关:TCP/IP协议。

TCP/IP诞生

这时的卡恩正在思考未来网络的发展问题,并开始在阿帕网上进行有关网路互联的研究。在BBN 公司内部刊物上,卡恩刚刚发表了一篇关于新网络通信协议的文章《操作系统的通信原理》,文中阐述的思想对早期互联网的总体设计和建设起了决定性的作用。

对于未来的网络,这时的卡恩依然有一个巨大的困惑。在阿帕网正式运行后,卡恩发现各个界面信息处理机(IMP)连接的时候需要用各种电脑都认可的信号才能打开信道,数据通过后还要关闭通道,而这些IMP本身并不能判断何时开始和结束信号接收。

随着接入网络电脑数量的增加,共同信号的选择变得越来越困难,网络的发展因此面临着巨大的阻滞。卡恩曾为此制定了一个临时使用的通信协议“网络控制协议”(NCP),但这距离一个普遍适用的协议依然相去甚远。幸运的是,卡恩至少还拥有瑟夫的支持。

瑟夫与卡恩绞尽脑汁地思考网络规则,术语“协议”(Protocol)不约而同地出现在两人的脑海中。这个原来的外交用语在这里也有了新的含义: “在吃饭聊天时各方达成的意向,”瑟夫说,“这才是我们选用这个词的本意”。在瑟夫的调侃中隐藏的,其实是另一个传奇故事。

1973年的某一天,瑟夫在旧金山一家宾馆的大堂里等人。百无聊赖之下,他开始思考网络架构问题。伟大的构想往往源自偶然的灵感,类似的故事就在这时光顾了瑟夫:这位近乎双耳失聪的科学家似乎突然听到了上帝的旨意而参透了网络的本质。苦于身边没纸,瑟夫只好将设想写在一个信封的背面。随后的历史证明,正是这个信封改变了互联网发展的轨迹。

1973年年底,瑟夫和卡恩合作完成了著名论文《关于分组交换网络的协议》。由于无法区分谁的贡献更大,两人决定用掷硬币的方法决定排名先后。结果,瑟夫“战胜”卡恩成为这篇论文的第一作者,“互联网之父”的名号从此蜚声科技世界。在这篇文章中,瑟夫和卡恩首先提出了一组新的协议:IP(Internet协议)和TCP(传输控制协议),合起来叫TCP/IP。

IP协议为接入网络中的每台计算机分配了一个独一无二的地址,并负责在传输过程中寻找到目的计算机。TCP协议则负责保证传输的可靠性:一旦传输中发现问题,该协议就会发出信号要求重新传输相关的数据直到所有数据安全正确地传输到目的地为止。

在TCP/IP网络中,系统的可靠性更多取决于主机而非网络,这使阿帕网最大的技术缺陷得以弥补。不同网络的链接因此成为可能,困扰卡恩的技术难题也在这一过程中迎刃而解。

为了验证TCP/IP在超远距离传输上的可靠性,瑟夫和卡恩还进行了一个著名的试验。他们设计了一个长达9.4万公里的路径,使数据包先后通过点对点卫星网络、陆地电缆和卫星间网络,并贯串了欧洲和美国的几乎所有电脑系统。最后,数据包完整地回到了实验室。

1974年,美国国防部决定无条件公布TCP/IP的核心技术,网络发展高潮因此迅速到来。

到1976年,阿帕网已经拥有60多个结点和超过100台主机,其触角遍及美国并通过卫星延伸到了欧洲。这一年2月,伊丽沙白二世在英国皇家信号与雷达研究院发出了一封电子邮件,这位一生钟爱科技的女王因此成为E-mail诞生5年来第一位使用该服务的国家元首。

1978年,来自芝加哥的科学家沃德·克里斯滕森(Ward Christiansen)和兰迪·苏斯(Randy Seuss)开发出了历史上第一个计算机公告牌系统CBBS。几乎与此同时,世界历史上的第一个新闻组、第一组表情符号以及第一

    
[2]Linux Shell编程语法
    来源:    发布时间: 2013-10-22

本文转自:http://www.cnblogs.com/fhefh/archive/2011/04/13/2014967.html

在计划好要程序干什么以及如何使用程序的使用变得更加简单易学之后,程序员就必须以计算机能够理解的方式把他的想法记录下来,告诉计算机他想干什么。这就是要用到的所谓的代码。一般按照如下顺序组织自己的思维:

1. 决定让计算机做哪些任务

2. 确定计算机执行任务的顺序

3. 从shell脚本语言中选择适当的命令来执行那些任务

4. 用linux文本编辑器编辑一个shell脚本,并按任务的执行顺序来组织命令

关于编程的几个术语

输送给计算机的单一一条指令称之为命令——command

集合在一起的多个命令称之为代码——code

为了完成某项任务而组织在一起的所有指令统称为程序——program

Linux中bash shell语音保留的关键字:

case

elif

let

clear

else

read

continue

if

then

echo

for in

while

变量

什么是数据?

程序从预付那儿获得的信息成为数据——data。一个好的程序遵从了下面三个步骤:

1. 从硬盘或文件中获得数据

2. 对数据进行某种适当的处理

3. 把数据显示在屏幕上火存放在一个文件中

字符串——string

字符串其实就是多个字母或字符的集合。一个字符即可能是一个连字符,也可能是在键盘上所能发现的任何东西。字符串也可能经由单一字母或字符组成。一个完整的句子可能是一个字符串。事实上,任何字母、空格、甚至是数字的组合,都可以看成是一个字符串。

数——number

一个数可由任何数字组成,如金钱数、某人的年龄或者身高、体重等。数既可以是负数也可以是正数、整数、分数、小数。在复杂一点,数也可以是字符。数的这种双重身份可能让我们感到疑惑,但是它无法欺骗计算机。如果告诉计算机是某个地址或电话号码的一部分,那么它就会把该数当做一个字母或字符。但是,如果让计算机把某数加起来,那么计算机就会把它当做数而不是字符。

理解什么是变量和值

计算机是知道如何区分用户输入的数据和字符串,但对人来说可能就像“迷×魂×汤”。就对我们读者而言,很容易把55-55-55当做是某个人的保险号,而计算机仅把它当做一个数或一个字符串。

当程序要用那个保险号时,它还必须告诉计算机:“现在是用保险号的时候了,你汉子道它放在哪儿了,对吗?它就放在变量名为SSS下了”

所谓的变量——variable,其实就是计算机中某一特定数的值(如保险号)的地方。而输给这个变量名sss的保险号就是一个值。

变量的分类

Linux使用下列两种分类:

局部变量:有程序员自己建立,且仅供程序员所设计的程序使用。

环境变量:由程序员或他人建立,程序员和他人的程序都可以使用。

Linux条件控制语句

我们一生都在决定。如,你想到哪儿去旅游,是去美国,日本还是法国?

决定是其实是一种明智的选择。但是我们得把它们建立在符合某种条件基础上,如我们有足够的资金去旅游吗?如果条件不成立,即使是最让人神往的选择也只是一种空想。

条件

条件是一种必须存在或不存在的状态。如果存在,则条件为真,否则为假。

Linux中,条件存在有如下两种表达形式:

Ø 单一变量

Ø 一个表达式

比如说,把所有的钱放进钱包(wallet)里。Wallet被称为变量,钱包里的钱被称为变量的值。是否去美国夏威夷,得要看自己的钱包中的钱是否足够。如果不够,则去不了。因此,钱包这个变量的值是零,这意味着去美国夏威夷旅游的钱不够,条件为假。

又比如说,钱包里有许多许钱。但对于这次旅行来说这些钱足够吗?这得问问我们自己了,看看钱包里的钱是否大于或等于$1000(旅行所需的money)。这就是一个表达式,它将导致真或假两种结果之一。

用变量表示的条件

一个变量的值要么是真要么是假。这通常用非零表示真,零表示假。下面就介绍确定一个变量的值是真还是假的两种方法。第一种方法显示检查变量的值,如下例所示:

If [$HaveEnoughMoney –eq 1]

程序将用等号算符(- eq)来确定变量的值是真还是假。

如果想判断一个条件是否是真,也可以让程序来检测变量的值是否是假,如下所示:

If [$HaveEnoughMoney – ne 0]

不等于算符(- ne)做出的是一种与逻辑相反的判断。如果用- eq算符,那么程序将检测该变量是否是真。相反,如果用- ne算符,那么程序将检测该变量是否不真,即假。

用表达式表示的条件

条件也可以说一个表达式,它要求程序对信息执行的某种操作。譬如,要求程序检测一个变量(如你的银行存款,O(∩_∩)O)的值是否大于某一个特定数。在这种情况下,一个表达式的结果也只可能有两种:真或假,且只能是其中之一,如下例所示:

If [$BankBalance –gt 3000]

-eq

等于

-gt

大于

-lt

小于

-ne

不等于

-ge

大于或等于

-le

小于或等于

程序检测变量BankBalance的值,看它是否大于3000,而这个表达式只有两种可能性:真或假。如果存款大于3000,则为真;存款小于3000,则为假。

If语句

当需要检测一个条件是真还是假的时候,就可以使用if语句。If语句仅仅是告诉程序:“如果条件为真,就执行这些指令,否则跳过这些指令。”

If语法的规则如下:

If {Condition}

Then

Instrution

fi

一般说来,如果Condition存在(即条件Condition为真),程序则执行项目的Instruction。

下面列举两个例子来说明if语句的用法。第一个例子是让程序判断一个盒子是否已经装满了,条件是盒子最多只能装下100个小甜饼。

if [$Quantity –eq 100]

then

echo “The box is full”

fi

这个语句让程序检测一下变量Quantity的值,看它是否为100.如果是,则在屏幕上显示:

The box is full.

否则,就跳过这条语句并移到fi的下一条语句。注意,在这里,fi是一个保留字,它有特殊的含义。(fi表示if语句的结束)

另一个例子,要求程序检测盒子是否已满,及是否还有其他的盒子可以获得。当且仅当这两个条件同时是真时,程序才会报告无法在装甜饼了,如下所示:

if [$Quantity –eq 100] && {$AvailableBoxes –it 1}

then

echo “The box is full and you have no more boxes”

fi

这条语句要求程序检测一下变量Quantity的值,看它是否100,及变量AvailableBoxes的值是否小于1.如果这两个条件都为真,则显示信息:

The box is full and you have no more boxes”

如果变量Quantity的值不是100,且分子也有剩余,程序则跳过这条语句,移到保留字fi的下一条语句。

if else语句

if语句可以使程序一句一个条件来做出某种判断,如果天哦见是真则执行一组规定的指令。

但是,在使用if语句时也存在着一个问题,即条件是假时,可能还需要为程序提供另外一组指令。当然,也可以再用一条if语句来解决这个问题,即在条件为假时让程序执行另一组指令。但是,有一种方法比这更简单,这就是if else语句。if else语句的语法规则是:

if [Condition]

then

Instruction1

else

Instruction2

fi

这条语句表示,如果Condition(条件)为真,程序则执行第一组指令(I

    
[3]Linux内核源码分析方法
    来源:    发布时间: 2013-10-22

Linux内核源码分析方法

 

一、内核源码之我见

Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次。如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径。我们都知道,想成为优秀的程序员,需要大量的实践和代码的编写。编程固然重要,但是往往只编程的人很容易把自己局限在自己的知识领域内。如果要扩展自己知识的广度,我们需要多接触其他人编写的代码,尤其是水平比我们更高的人编写的代码。通过这种途径,我们可以跳出自己知识圈的束缚,进入他人的知识圈,了解更多甚至我们一般短期内无法了解到的信息。Linux内核由无数开源社区的“大神们”精心维护,这些人都可以称得上一顶一的代码高手。透过阅读Linux内核代码的方式,我们学习到的不光是内核相关的知识,在我看来更具价值的是学习和体会它们的编程技巧以及对计算机的理解。

我也是通过一个项目接触了Linux内核源码的分析,从源码的分析工作中,我受益颇多。除了获取相关的内核知识外,也改变了我对内核代码的过往认知:

1.内核源码的分析并非“高不可攀”。内核源码分析的难度不在于源码本身,而在于如何使用更合适的分析代码的方式和手段。内核的庞大致使我们不能按照分析一般的demo程序那样从主函数开始按部就班的分析,我们需要一种从中间介入的手段对内核源码“各个击破”。这种“按需索取”的方式使得我们可以把握源码的主线,而非过度纠结于具体的细节。

2.内核的设计是优美的。内核的地位的特殊性决定着内核的执行效率必须足够高才可以响应目前计算机应用的实时性要求,为此Linux内核使用C语言和汇编的混合编程。但是我们都知道软件执行效率和软件的可维护性很多情况下是背道而驰的。如何在保证内核高效的前提下提高内核的可维护性,这需要依赖于内核中那些“优美”的设计。

3.神奇的编程技巧。在一般的应用软件设计领域,编码的地位可能不被过度的重视,因为开发者更注重软件的良好设计,而编码仅仅是实现手段问题——就像拿斧子劈柴一样,不用太多的思考。但是这在内核中并不成立,好的编码设计带来的不光是可维护性的提高,甚至是代码性能的提升。

每个人对内核的了理解都会有所不同,随着我们对内核理解的不断加深,对其设计和实现的思想会有更多的思考和体会。因此本文更期望于引导更多徘徊在Linux内核大门之外的人进入Linux的世界,去亲自体会内核的神奇与伟大。而我也并非内核源码方面的专家,这么做也只是希望分享我自己的分析源码的经验和心得,为那些需要的人提供参考和帮助,说的“冠冕堂皇”一点,也算是为计算机这个行业,尤其是在操作系统内核方面贡献自己的一份绵薄之力。闲话少叙(已经罗嗦了很多了,囧~),下面我就来分享一下自己的Linix内核源码分析方法。

二、内核源码难不难?

从本质上讲,分析Linux内核代码和看别人的代码没有什么两样,因为摆在你面前的一般都不是你自己写出来的代码。我们先举一个简单的例子,一个陌生人随便给你一个程序,并要你看完源码后讲解一下程序的功能的设计,我想很多自我感觉编程能力还可以的人肯定觉得这没什么,只要我耐心的把他的代码从头到尾看完,肯定能找到答案,并且事实确实是如此。那么现在换一个假设,如果这个人是Linus,给你的就是

    
最新技术文章:
▪linux系统中的列出敏感用户的脚本代码
▪a10 config backup for aXAPI
▪一键备份gitolite服务器的Shell脚本
▪nagios 分发文件实现代码
▪阿里云云服务器Linux系统更新yum源Shell脚本
▪一个监控LINUX目录和文件变化的Shell脚本分享
▪Linux下实现SSH免密码登录和实现秘钥的管理、...
▪Shell正则表达式之grep、sed、awk实操笔记
▪3个备份系统文件并邮件发送的Shell脚本分享
▪CentOS 6.3下给PHP添加mssql扩展模块教程
▪监控网站是否可以正常打开的Shell脚本分享
▪shell脚本编程之if语句学习笔记
▪shell脚本编程之循环语句学习笔记
▪shell脚本编程之case语句学习笔记
▪Shell脚本实现的阳历转农历代码分享
▪Shell脚本实现复制文件到多台服务器的代码分...
▪Shell脚本实现批量下载网络图片代码分享
▪Shell脚本实现检测文件是否被修改过代码分享
▪Shell脚本数组用法小结
▪Shell脚本批量重命名文件后缀的3种实现
▪C语言实现的ls命令源码分享
▪Linux下查找后门程序 CentOS 查后门程序的shell脚...
▪Shell 函数参数
▪linux shell 自定义函数方法(定义、返回值、变...
▪Shell实现判断进程是否存在并重新启动脚本分...
▪Shell脚本break和continue命令简明教程
▪Shell脚本函数定义和函数参数
▪让代码整洁、过程清晰的BASH Shell编程技巧
▪shell常用重定向实例讲解
▪awk中RS、ORS、FS、OFS的区别和联系小结
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3