原创 linux学习学期总结----大二第一学期

2009-4-11 21:43 3389 2 4 分类: 工程师职场

 一学期很快的过去了,即将迎来的是新的一年。总结这学期加入小组以来的各项事宜。有许多的收获,有许多的成长,同时也有许多的不足。
本学期主要学习内容:
一、linux的历史及简介
    (1)什么是linux?
    Linux诞生于1991年10月,至今已有十多年历史。Linux是一套免费且功能完整的UNIX软件。且它是一个32位的操作系统,运作稳定且有效率,被广泛用作服务器操作系统。Linux承袭的是开放式原始码(Open Source)的精神,所有Linux Source Code(源代码)均可免费取得,这使得它相对其它的操作系统(尤其是昂贵的Windows NT)而言价格极其便宜。同时,因为它的源代码是开放的,因此,可以方便地被全球数以万计的程序员应用并不断改进,使得它在技术上的进展突飞猛进—--目前Linux的内核已经升级到2.4版。这种进步使得Linux成为市场倍加青睐的操作系统,1999年,Linux超过了Novell公司的 Netware,成为仅次于微软Windows NT的排名第二的服务器操作系统。IDC预测,未来四年Linux的出货量将以年增长28%的比例增长,从1999年的130万套增长到2004年的 470万套。


    目前,全球最大的Linux是Red Hat Linux,红旗Linux则是中国Linux的第一品牌。
   
    (2)linux的历史及其发展
    Linux 操作系统是UNIX 操作系统的一种克隆系统。它诞生于1991 年的10 月5 日(这是第一次正式向外公布的时间)。以后借助于Internet 网络,并经过全世界各地计算机爱好者的共同努力下,现已成为今天世界上使用最多的一种UNIX 类操作系统,并且使用人数还在迅猛增长。Linux 操作系统的诞生、发展和成长过程始终依赖着以下五个重要支柱:UNIX 操作系统、MINIX 操作系统、GNU 计划、POSIX 标准和Internet 网络。
   
     下面主要根据这五个基本线索来追寻一下Linux 的开发历程,它的酝酿过程,最初的发展经历。
   
   *UNIX 操作系统的诞生
  Linux 操作系统是UNIX 操作系统的一个克隆版本。UNIX 操作系统是美国贝尔实验室的Ken.Thompson和Dennis Ritchie 于1969 年夏在DEC PDP-7 小型计算机上开发的一个分时操作系统。当时Ken Thompson 为了能在闲置不用的PDP-7 计算机上运行他非常喜欢的星际旅行(Space travel)游戏,在1969 年夏天乘他夫人回家乡加利福尼亚渡假期间,在一个月内开发出了unix 操作系统的原型。当时使用的是BCPL 语言(基本组合编程语言),后经Dennis Ritchie 于1972 年用移植性很强的C 语言进行了改写,使得UNIX 系统在大专院校得到了推广。


   *MINIX 操作系统
  MINIX 系统是由Andrew S. Tanenbaum(AST)开发的。AST 是在荷兰Amsterdam 的Vrije 大学数学与计算机科学系统工作,是ACM 和IEEE 的资深会员(全世界也只有很少人是两会的资深会员)。共发表了100 多篇文章,5 本计算机书籍。AST 虽出生在美国纽约,但是是荷兰侨民(1914 年他的祖辈来到美国)。他在纽约上的中学、M.I.T上的大学、加洲大学Berkeley 分校念的博士学位。由于读博士后的缘故,他来到了家乡荷兰。从此就与家乡一直有来往。后来就在Vrije 大学开始教书、带研究生了。荷兰首都Amsterdam 是个常年阴雨绵绵的城市,而对于AST 来说,这最好不过了,因为这样他就可以待在家里摆弄他的计算机了。MINIX 是他1987年编制的,主要用于学生学习操作系统原理。到91年时版本是1.5。目前主要有两个版本在使用: 1.5 版和2.0 版,当时该操作系统在大学使用是免费的,但其它用途不是,当然目前都已经是免费的,可以从许多FTP上下载。
对于Linux 系统,他表示对其开发者Linus 的称赞。但他认为Linux 的发展有很大原因是因为他为了保持minix 的小型化,能让学生在一个学期内就能学完,而没有接纳全世界许多人对Minix 的扩展要求。因此这激发了Linus 编写Linux。Linus 正好抓住了这个好时机。
  
  作为一个操作系统,MINIX 并不是优秀者,但它同时提供了用C 语言和汇编语言写的系统源代码。这是第一次使得有抱负的程序员或hacker 能够阅读操作系统的源代码,在当时这种源代码是软件商一直小心地守护着的。


   *GNU 计划
  GNU 计划和自由软件基金会(the Free Software Foundation - FSF)是由Richard M. Stallman 于1984 年一手创办的。旨在开发一个类似 Unix、并且是自由软件的完整操作系统:GNU 系统。(GNU 是"GNU's Not Unix"的递归缩写,它的发音为"guh-NEW"。)各种使用linux 作为核心的GNU 操作系统正在被广泛的使用。虽然这些系统通常被称作"Linux",但是严格地说,它们应该被称为GNU/Linux 系统。


  到上世纪90 年代初,GNU 项目已经开发出许多高质量的免费软件,其中包括有名的emacs 编辑系统、bash shell 程序、gcc 系列编译程序、gdb 调试程序等等。这些软件为Linux 操作系统的开发创造了一个合适的环境,是Linux 能够诞生的基础之一。以至于目前许多人都将Linux 操作系统称为"GNU/Linux"操作系统。


   *POSIX 标准
  POSIX(Portable Operating System Interface for Computing Systems)是由IEEE 和ISO/IEC 开发的一簇标准。该标准是基于现有的UNIX 实践和经验,描述了操作系统的调用服务接口,用于保证编制的应用程序可以在源代码一级上在多种操作系统上移植运行。它是在1980 年早期一个UNIX 用户组(usr/group)的早期工作的基础上取得的。该UNIX 用户组原来试图将AT&T 的系统V 和Berkeley CSRG的BSD 系统的调用接口之间的区别重新调和集成,从而于1984 年产生了/usr/group 标准。1985 年,IEEE操作系统技术委员会标准小组委员会(TCOS-SS)开始在ANSI 的支持下责成IEEE 标准委员会制定有关程序源代码可移植性操作系统服务接口正式标准。到了1986 年4 月,IEEE 就制定出了试用标准。第一个正式标准是在1988 年9 月份批准的(IEEE 1003.1-1988),也既以后经常提到的POSIX.1 标准。


  1989 年POSIX 的工作被转移至ISO/IEC 社团,并由15 工作组继续将其制定成ISO 标准。到1990 年,POSIX.1 与已经通过的C 语言标准联合,正式批准为IEEE 1003.1-1990(也是ANSI 标准)和ISO/IEC 9945-1:1990 标准。
  
  POSIX.1 仅规定了系统服务应用程序编程接口(API),仅概括了基本的系统服务标准,因此期望对系统的其它功能也制定出标准。这样IEEE POSIX 的工作就开始展开了。在1990 年,刚开始有十个批准的计划在进行,有近300 多人参加每季度为期一周的会议。着手的工作有命令与工具标准(POSIX.2)、测试方法标准(POSIX.3)、实时API(POSIX.4)等。到了 1990 年上半年已经有25 个计划在进行,并且有16 个工作组参与了进来。与此同时,还有一些组织也在制定类似的标准,如X/Open,AT&T,OSF 等。


  在90 年代初,POSIX 标准的制定正处在最后投票敲定的时候,那是1991-1993 年间。此时正是Linux刚刚起步的时候,这个UNIX 标准为Linux 提供了极为重要的信息,使得Linux 的能够在标准的指导下进行开发,能够与绝大多数UNIX 系统兼容。在最初的Linux 内核代码中(0.01 版、0.11 版)就已经为Linux与POSIX 标准的兼容做好了准备工作。在0.01 版的内核/include/unistd.h 文件中就已经定义了几个有关POSXI 标准要求的常数符号,并且在注释中就写到"ok,这也许是个玩笑,但我正在着手研究它呢"。


  1991 年7 月3 日在comp.os.minix 上发布的post 上就已经提到了正在搜集POSIX 的资料。(当然此时还不存在Linux 这个名称,当时Linus 的脑子里想的可能是FREAX ,FREAX 的英文含义是怪诞的、怪物、异想天开等)。其中透露了他正在进行Linux 系统的开发,并且在Linux 最初的时候已经想到要实现与POSIX(UNIX 的国际标准)的兼容问题了。
   
    *Internet网络
    Internet网络的重要性显而易见,在此不再做过多说明。


二、linux操作系统的安装与换源
     安装过程中最大的问题就是分区———windows磁盘格式一般为FAT32、NTFS等,而linux两种格式:一种是linux native主分区(Ext2或Ext3格式),一种是linux swap交换分区。这两种分区格式的安全性与稳定性极佳,结合linux操作系统后,死机的机会大大减少,能让我们摆脱windows常常崩溃的噩梦。
   
    我操作过程中具体分区如下:
    SWAPSPACE linuxswap 2048M 逻辑
    boot linux Ext3 1024M 逻辑
    linux linux Ext3 17408M 主
   
     安装完系统后的换源:


    打开终端
    首先,执行sudo gedit /etc/apt/sources.list
    然后删掉sources.list原来的所有内容,把以下内容(不需要改动)粘贴至sources.list文件,保存
    执行sudo apt-get update
    大功告成。。。



#中国科技大学
deb http://debian.ustc.edu.cn/ubuntu/ hardy main restricted universe
multiverse
deb http://debian.ustc.edu.cn/ubuntu/ hardy-backports restricted
universe multiverse
deb http://debian.ustc.edu.cn/ubuntu/ hardy-proposed main restricted
universe multiverse
deb http://debian.ustc.edu.cn/ubuntu/ hardy-security main restricted
universe multiverse
deb http://debian.ustc.edu.cn/ubuntu/ hardy-updates main restricted
universe multiverse
deb-src http://debian.ustc.edu.cn/ubuntu/ hardy main restricted
universe multiverse
deb-src http://debian.ustc.edu.cn/ubuntu/ hardy-backports main
restricted universe multiverse
deb-src http://debian.ustc.edu.cn/ubuntu/ hardy-proposed main
restricted universe multiverse
deb-src http://debian.ustc.edu.cn/ubuntu/ hardy-security main
restricted universe multiverse
deb-src http://debian.ustc.edu.cn/ubuntu/ hardy-updates main
restricted universe multiverse


deb ftp://mirror.lzu.edu.cn/ubuntu/ hardy main restricted universe
multiverse
deb ftp://mirror.lzu.edu.cn/ubuntu/ hardy-backports restricted
universe multiverse
deb ftp://mirror.lzu.edu.cn/ubuntu/ hardy-proposed main restricted
universe multiverse
deb ftp://mirror.lzu.edu.cn/ubuntu/ hardy-security main restricted
universe multiverse
deb ftp://mirror.lzu.edu.cn/ubuntu/ hardy-updates main restricted
universe multiverse
deb-src ftp://mirror.lzu.edu.cn/ubuntu/ hardy main restricted universe
multiverse
deb-src ftp://mirror.lzu.edu.cn/ubuntu/ hardy-backports main
restricted universe multiverse
deb-src ftp://mirror.lzu.edu.cn/ubuntu/ hardy-proposed main restricted
universe multiverse
deb-src ftp://mirror.lzu.edu.cn/ubuntu/ hardy-security main restricted
universe multiverse
deb-src ftp://mirror.lzu.edu.cn/ubuntu/ hardy-updates main restricted
universe multiverse
#台湾大学 中国电信adsl 150k/s
deb http://ubuntu.csie.ntu.edu.tw/ubuntu/ hardy main restricted
universe multiverse
deb http://ubuntu.csie.ntu.edu.tw/ubuntu/ hardy-backports restricted
universe multiverse
deb http://ubuntu.csie.ntu.edu.tw/ubuntu/ hardy-proposed main
restricted universe multiverse
deb http://ubuntu.csie.ntu.edu.tw/ubuntu/ hardy-security main
restricted universe multiverse
deb http://ubuntu.csie.ntu.edu.tw/ubuntu/ hardy-updates main
restricted universe multiverse
deb-src http://ubuntu.csie.ntu.edu.tw/ubuntu/ hardy main restricted
universe multiverse
deb-src http://ubuntu.csie.ntu.edu.tw/ubuntu/ hardy-backports main
restricted universe multiverse
deb-src http://ubuntu.csie.ntu.edu.tw/ubuntu/ hardy-proposed main
restricted universe multiverse
deb-src http://ubuntu.csie.ntu.edu.tw/ubuntu/ hardy-security main
restricted universe multiverse
deb-src http://ubuntu.csie.ntu.edu.tw/ubuntu/ hardy-updates main
restricted universe multiverse


#电子科大,但不是uestc的官方域名
deb http://ubuntu.dormforce.net/ubuntu hardy main restricted universe
multiverse
deb http://ubuntu.dormforce.net/ubuntu hardy-backports main restricted
universe multiverse
deb http://ubuntu.dormforce.net/ubuntu hardy-proposed main restricted
universe multiverse
deb http://ubuntu.dormforce.net/ubuntu hardy-security main restricted
universe multiverse
deb http://ubuntu.dormforce.net/ubuntu hardy-updates main restricted
universe multiverse
deb-src http://ubuntu.dormforce.net/ubuntu hardy main restricted
universe multiverse
deb-src http://ubuntu.dormforce.net/ubuntu hardy-backports main
restricted universe multiverse
deb-src http://ubuntu.dormforce.net/ubuntu hardy-proposed main
restricted universe multiverse
deb-src http://ubuntu.dormforce.net/ubuntu hardy-security main
restricted universe multiverse
deb-src http://ubuntu.dormforce.net/ubuntu hardy-updates main
restricted universe multiverse
#东北大学更新服务器:
deb http://mirror.rootguide.org/ubuntu/ hardy main multiverse
restricted universe
deb http://mirror.rootguide.org/ubuntu/ hardy-backports main
multiverse restricted universe
deb http://mirror.rootguide.org/ubuntu/ hardy-proposed main multiverse
restricted universe
deb http://mirror.rootguide.org/ubuntu/ hardy-security main multiverse
restricted universe
deb http://mirror.rootguide.org/ubuntu/ hardy-updates main multiverse
restricted universe
deb-src http://mirror.rootguide.org/ubuntu/ hardy main multiverse
restricted universe
deb-src http://mirror.rootguide.org/ubuntu/ hardy-backports main
multiverse restricted universe
deb-src http://mirror.rootguide.org/ubuntu/ hardy-proposed main
multiverse restricted universe
deb-src http://mirror.rootguide.org/ubuntu/ hardy-security main
multiverse restricted universe
deb-src http://mirror.rootguide.org/ubuntu/ hardy-updates main
multiverse restricted universe
#西南财经大学
deb http://ftp.swufe.edu.cn/mirror/ubuntu/ hardy main restricted
universe multiverse
deb http://ftp.swufe.edu.cn/mirror/ubuntu/ hardy-backports restricted
universe multiverse
deb http://ftp.swufe.edu.cn/mirror/ubuntu/ hardy-proposed main
restricted universe multiverse
deb http://ftp.swufe.edu.cn/mirror/ubuntu/ hardy-security main
restricted universe multiverse
deb http://ftp.swufe.edu.cn/mirror/ubuntu/ hardy-updates main
restricted universe multiverse
deb-src http://ftp.swufe.edu.cn/mirror/ubuntu/ hardy main restricted
universe multiverse
deb-src http://ftp.swufe.edu.cn/mirror/ubuntu/ hardy-backports main
restricted universe multiverse
deb-src http://ftp.swufe.edu.cn/mirror/ubuntu/ hardy-proposed main
restricted universe multiverse
deb-src http://ftp.swufe.edu.cn/mirror/ubuntu/ hardy-security main
restricted universe multiverse
deb-src http://ftp.swufe.edu.cn/mirror/ubuntu/ hardy-updates main
restricted universe multiverse
#ubuntu cn99源
deb http://ubuntu.cn99.com/ubuntu/ gutsy main restricted universe
multiverse
deb http://ubuntu.cn99.com/ubuntu/ gutsy-security main restricted
universe multiverse
deb http://ubuntu.cn99.com/ubuntu/ gutsy-updates main restricted
universe multiverse
deb http://ubuntu.cn99.com/ubuntu/ gutsy-proposed main restricted
universe multiverse
deb http://ubuntu.cn99.com/ubuntu/ gutsy-backports main restricted
universe multiverse
deb-src http://ubuntu.cn99.com/ubuntu/ gutsy main restricted universe
multiverse
deb-src http://ubuntu.cn99.com/ubuntu/ gutsy-security main restricted
universe multiverse
deb-src http://ubuntu.cn99.com/ubuntu/ gutsy-updates main restricted
universe multiverse
deb-src http://ubuntu.cn99.com/ubuntu/ gutsy-proposed main restricted
universe multiverse
deb-src http://ubuntu.cn99.com/ubuntu/ gutsy-backports main restricted
universe multiverse
deb http://ubuntu.cn99.com/ubuntu-cn/ gutsy main restricted universe
multiverse
#Ubuntu-cn,推荐各位中文用户添加:
deb http://archive.ubuntu.org.cn/ubuntu-cn/ gutsy main restricted
universe multivers
已经帮人装过系统了,收获颇多。


三、linux的基本命令
   1、注销,关机,重启
   (1)注销系统的logout命令
  Logout 注销是登陆的相对操作,登陆系统后,若要离开系统,用户只要直接下达logout命令即可:
  [root@localhost root]#logout
   (2)关机或重新启动的shutdown命令
  Shutdown命令可以关闭所有程序,依照用户的需要,重新启动或关机。
   (3)重新启动计算机的reboot命令
  顾名思义,reboot命令是用来重新启动系统的。常用的参数如下:
  ? -f 参数:不依正常的程序运行关机,直接关闭系统并重新启动计算机。
  ? -I 参数:在在重新启动之前关闭所有网络接口。
  虽然reboot命令有个参数可以使用,但是一般只需要单独运行reboot命令就可以了
  
   2、文件与目录的操作
  (1)列出文件列表的ls命令
  ls(list)命令是非常有用的命令,用来显示当前目录中的文件和子目录列表。配合参数的使用,能以不同的方式显示目录内容。
    (2)切换目录的cd命令
  cd(change directory)命令可让用户切当前所在的目录。
   (3)创建目录的mkdir命令
  Mkdir(make directory)命令可用来创建子目录。
    (4)删除目录的rmdir命令
  rmdir(remove directory)命令可用来删除"空"的子目录。
    (5)复制文件的cp命令
  cp(copy)命令可以将文件从一处复制到另一处。一般在使用cp命令将以个文件复制成另一个文件或复制到某个目录时,需要指定原始文件名与目的文件名或目录。
    (6)删除文件或目录的rm命令
  rm(remove)命令可以删除文件或目录。
    (7)让显示画面暂停的more命令
  为了避免画面显示瞬间就闪过去,用户可以使用more命令,让画面在显示满一页时暂停,此时可按空格键继续显示下一个画面,或按Q键停止显示。
    (8)连接文件的cat命令
  cat(concatenate) 命令可以显示文件的内容(经常和more命令搭配使用),或是将数个文件合并成一个文件。
    (9)移动或更换文件,目录名称的mv命令
    mv (move)命令可以将文件及目录移动到另一个目录下面,或更换文件及目录的名称。
    (10) 显示当前所在目录的pwd命令
  pwd(print working directory)命令可显示用户当前所在的目录。
    (11)查找文件的locate命令
  locate 命令可用来搜索包含指定条件字符串的文件或目录。
    (12)搜索字符串得grep命令
  grep 命令可以搜索特定字符串来并显示出来,一般用来过滤先前得结果,避免显示太多不必要得信息。
    (13)重导与管道
  重导(redirect)可将某命令的结果输出导文件中,它有两中命令:">"和">>"。">"可将结果输出到文件中,该文件原有的内容会被删除:">>"则将结果附加到文件中,原文件内容不会被清除。
    3、使用光盘及软盘
  在Linux的文字模式下要使用光盘或软盘,并不是只将光盘或软盘放入即可,用户需要运行加载的命令,才可读写数据。所谓加载就是将存储介质(如光盘和软盘)指定成系统中的某个目录(如/mnt/cdrom或mnt/floppy)。通过直接存取此加载目录,即可读写存储介质中的数据。
    (1)加载的mount命令
  要使用光盘时先把光盘放入光驱,然后执行加载的mount命令,将光盘加载至系统中
    (2)卸载的umount命令
  如果不需要使用光盘或软盘,则需先执行卸载命令之后,才能将光盘或软盘退出
    4、在后台运行程序
  用户有时的程序有可能要花费很多时间,如果将它放在前台运行,将导致无法继续做其他事情,最好的方法就是将它放在后台运行,甚至可能希望在用户注销系统后,程序还可以继续运行。
  (1)在后台运行程序的&、bg命令
  将程序放到后台运行的最简单方法就是在命令最后加上"&",范例如下:
  (2)前台运行的程序fg命令
  如果用户当前已有程序在后台运行,可以输入fg命令,将它从背景中移到前台运行:
  (3)在退出后让程序继续运行的nohup命令
  此命令可使用户退出系统后,程序继续运行。
    5、任务调度命令
  计算机有很多程序需要周期性的被运用,例如清理磁盘中不要的暂存盘、备份系统数据、检查远程服务器的邮件等。对于这些重复性的工作,其实不需要每次都辛苦地运行这些程序。可利用任务调度命令,指定系统定期在某个时间运行这些程序,轻轻松松完成想要执行的工作。
  任务调度的crond常驻命令
  crond 是Linux用来定期执行程序的命令。当安装完成操作系统后,默认便会启动此任务调动命令。crond命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作,便会自动执行该工作。
    6、任务调度的系统工作
  /ect/crontab/文件是Linux系统工程的任务调度设置文件,其默认的内容如下:
  SHELL=/bin/bash ← 指定执行任务调度工作时所使用的SHELL
  PATH=/shin:/bin:/usr/sbin:/usr/bin ← 指定命令搜索的路径
  MAILTO=root ← 指定将输出结果给root用户
  HOME=/ ← 指定跟目录
    7、改变文件或目录的访问权限命令 
    Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。
    chmod 命令
    chmod命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限。
     该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。
    8、设置修改密码命令
    passwd命令
     出于系统安全考虑,Linux系统中的每一个用户除了有其用户名外,还有其对应的用户口令。因此使用useradd命令增加时,还需使用passwd命令为每一位新增加的用户设置口令;用户以后还可以随时用passwd命令改变自己的口令
     等等。
   我目前对命令还不太熟悉,需要进一步的练习。
 
  四、linux编程实例:
编程题目:


myecho命令


命令简介:


功能说明 :
显示文字。
语 法:
echo [-ne][字符串]或 echo [--help][--version]
补充说明:echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开并在最后加上换行号。
参 数:
-n 不要在最后自动换行
-e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;
--help 显示帮助
--version 显示版本信息


 具体代码如下:
#include<stdio.h>
#include <unistd.h>
#include<getopt.h>
#include <stdlib.h>
const struct option long_options[]={//长选项转换
    {"help",0,NULL,'h'},
    {"version",0,NULL,'v'},
    {NULL,0,NULL,0}
};


 


int main(int argc,char **argv)
{


    int  flag,fn=0,fe=0,i=0;
    while((flag = getopt(argc, argv, ":nveh")) != -1)
    {
        switch(flag)
        {
            case 'n':
                fn="1";
                break;
            case 'e':
                fe="1";
                break;
            case 'v':
                printf("版本信息\n");
                exit(0);
                break;
            case 'h':
                printf("help message\n");
                exit(0);
                break;
            default:;
              
        }
    }
    if(fe==0)
        printf("%s",argv[argc-1]);
    else {
        while(argv[argc-1]!='\0'){


            if(argv[argc-1]=='\\'){
                switch(argv[argc-1][i+1]){
                    case 'n':printf("\n");break;
                    case 't':printf("\t");break;
                    case 'b':printf("\b");break;
                    case 'r':printf("\r");break;
                    default: printf("\\%c",argv[argc-1][i+1]);
                }
                i++;
            }else printf("%c",argv[argc-1]);
            i++;
        }
    }
    if(fn==0)
        printf("\n");


}
    我第一次接触linux就是练习的这个题目,让我对linux有了初步的了解。编程过程中主要练习了linux下c语言的编辑、编译、调试和运行的实现过程,简单了解了vim、vi、gcc的使用,收获很多,但是对于gdb的使用还不是很清楚,打算在假期进一步的学习。


五、shell编程
  Shell编程有很多类似C语言和其他程序语言的特征,但是又没有编程语言那样复杂。Shell程序就是放在一个文件中的一系列Linux命令和实用程序,在执行的时候,通过Linux一个接着一个地解释和执行每个命令。
  具体实例:
    这是我们几个刚加入的成员写的自动寻找代理服务器和修改IP,并且实现上网功能的shell脚本      
 
#! /bin/bash         
a=1                                                                                   # 用于表示网关的第三段
b=1                                                                                   # 用于表示网关的第四段
c=1                                                                                   # 用于表示IP的第四段
d=0                                                                                   # 用于记录ping同一个段IP的次数
while [ $a -lt 255 ]
   do
      while [ $b -lt 255 ]
          do
          ping  -w 1 192.168.$a.$b                                           # ping 网关
          if [ $? -eq 0 ]                                                            #判断是否能ping通此地址
            then                                                                      #假如能ping通此地址,那么就怀疑此地址为网关,再进行下一步的运算
              echo "此地址可能为服务器地址"
               while [ $c -lt 254 ]
                   do 
                     if [ $c -eq $b ]                                               #假如IP和网关相等,就重新设置IP
                        then
                             continue
                     fi
                     ifconfig eth0 192.168.$a.$c                            #修改IP
                     route add default gw 192.168.$a.$b                #修改网关
                    ping -w 1 202.108.22.5                                   #ping 外网百度的IP
                     ((d++))
                     if [ $? -eq 0 ]                                                #判断是否能够ping通外网
                         then                                                        #如果ping外网成功
                             echo "搜索成功!"
                             echo "The gateway is 192.168.$a.$b"     
                             echo "The right IP is 192.168.$a.$c"
                             exit 0
                             else
                             ((c=c+15))
                             echo "进入下一次的IP设置"
                      fi
                      if [ $d -eq 3 ]                                                #如果ping同一段 的IP3次
                      then
                          break;
                      fi
                done
                    echo "进入下一次网关的设置"
                    ((c=1))
                    ((b++))
         else
                    ((b++))                                                            #网关的第四段遍历 
         fi
      done
                   ((c=1))
                   ((b=100))
                   ((a++))                                                             #网关的第三段遍历
 done
      echo "搜索失败"
          
       这段学习比较懒散,关于shell编程还须进一步认真学习,要不然真的要被大家落下了。          
                                  
六、进程环
   题目要求:创建一个进程环,在进程之间传递Fibonacci数列的计算结果,第x个进程计算Fibonacci数列的第x项。最后一个进程计算完把最后结果传递给第一个进程,并且打印出来。
  1、什么是进程
  
   当运行任何一个UNIX命令时,shell至少会建立一个进程来运行这个命令,所以可以把任何在UNIX系统中运行的程序叫做进程;但是进程并不是程序,进程是动态的,而程序是静态的,并且多个进程可以并发的调用同一个程序。
  
  系统中每一个进程都包含一个task_struct数据结构,所有指向这些数据结构的指针组成一个进程向量数组,系统缺省的进程向量数据大小是512,表示系统中可同时容纳512个进程。进程的task_struct数据结构包括了进程的状态、调度信息、进程标识符等信息。
  
  由于 UNIX系统是一个多进程的操作系统,所以每一个进程都是独立的,都有自己的权限及任务,所以当某一进程失败时并不会导致别的进程失败。系统通过进程标识符来区分不同的进程,进程标识符是一个非负正数,他在任何时刻都是唯一的,当某个进程结束时,他的进程标识符可以分配给另外一个新进程。系统将标识符 0分配给调度进程,标识符1分配给初始化进程。
  
   进程在运行期间,会用到很多资源,包括最宝贵的CPU资源,当某一个进程占用CPU资源时,别的进程必须等待正在运行的进程空闲CPU后才能运行,由于存在很多进程在等待,所以内核通过调度算法来决定将CPU分配给哪个进程。
  
   系统在刚刚启动时,运行于内核方式,这时候只有一个初始化进程在运行,他首先做系统的初始化,然后执行初始化程序(一般是/sbin/init)。初始化进程是系统的第一个进程,以后所有的进程都是初始化进程的子进程。
 


  2、用到的主要几个函数:
 (1) pipe(建立管道)


表头文件 #include<unistd.h>
定义函数 int pipe(int filedes[2]);
函数说明
    pipe()会建立管道,并将文件描述词由参数 filedes 数组返回。
    filedes[0]为管道里的读取端,所以pipe用read调用的
    filedes[1]则为管道的写入端。
   
返回值:  若成功则返回零,否则返回-1,错误原因存于 errno 中。
错误代码:
    EMFILE 进程已用完文件描述词最大量
    ENFILE 系统已无文件描述词可用。
    EFAULT 参数 filedes 数组地址不合法。


  (2)【fork系统调用】 
  
功能描述:
一个子进程。所建立的子进程PID 和 PPID不同于其父进程,同时资建立源使用被设置为0,文件锁和挂起的信号不被继承。


Linux内部,fork的执行使用copy-on-write页面,所以耗费的资源只是拷贝父进程页表,建立唯一子进程task结构体的时间和内存。



用法:
#include <sys/types.h>
#include <unistd.h>


pid_t fork(void);



  
返回说明: 
成功执行时,在父进程的线程执行中返回子进程PID,在子进程的线程执行中返回0。失败时在父进程的语境中返回-1,errno被设为以下的某个值 
EAGAIN:
1.不能为拷贝父进程的页表和子进程的task结构分配足够的内存
2.不可能再建立新的子进程,因为调用者已达到RLIMIT_NPROC的资源限制,除了调用进程有CAP_SYS_ADMIN 或 CAP_SYS_RESOURCE的权限
ENOMEM:内核内存不足,无法分配必须的数据结构


  (3)【getpid/getppid系统调用】 
  
功能描述:
getpid返回当前进程标识,getppid返回父进程标识。


  (4)【dup/dup2系统调用】 
  
功能描述:
根据一个文件描述词复制给另一个文件描述词,所复制出的文件描述词索引同一文件。
  
用法:
#include <unistd.h>
#include <fcntl.h>


int dup(int oldfd); 
int dup2(int oldfd, int newfd); 
 
参数: 
oldfd:原来的文件描述词。
newfd:新文件描述词。
  
返回说明: 
成功执行时,返回0。失败返回-1,errno被设为以下的某个值
EBADF:oldfd或newfd文件描述词无效,可能oldfd对应的文件尚未打开,或者newfd超出所允许的文件描述词范围 
EBUSY: dup2()操作执行时发生竞速
EINTR: dup2()操作被信号中断
EMFILE: 进程已超出所允许使用的最大文件描述词范围
   3、具体代码如下:


#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include <sys/wait.h>
int main()
{
    int fd[2];
    int n,i=1;
        int error;
    printf("please input n(1~46):");
    scanf("%d",&n);
    if(n>47||n<0){
    printf("Out of range ( 1~ 46 )!\n");
    return 1;
    }
    int a[n+2];
    a[0]=0;
    a[1]=1;
    pid_t childpid="0",fpid;
    fpid="getpid"();
    if(pipe(fd)==-1){
        perror("Failed to create starting pipe");
        return 1;
    }
    if((dup2(fd[0],STDIN_FILENO)==-1)||(dup2(fd[1],STDOUT_FILENO)==-1)){
        perror("Failed to dup");
        return 1;
    }
    if((close(fd[0])==-1)||(close(fd[1])==-1)){
        perror("Failed to close extra descriptors");
        return 1;
    }
    for(i=1;i<n+1;i++){
        if(pipe(fd)==-1){
            perror("Failed to create starting pipe");   
            return 1;
        }
        if((childpid=fork())==-1){
            perror("Failed to fork");
            return 1;
        }
        if(childpid>0) 
            error="dup2"(fd[1],STDOUT_FILENO);        
        else if(!childpid)     
               error="dup2"(fd[0],STDIN_FILENO);
        if((close(fd[0])==-1)||(close(fd[1])==-1)){
            perror("Failed to close extra descriptors");
            return 1;
        }
        if(fpid==getpid())   
                        write(STDOUT_FILENO,a,sizeof(a));
        else if(childpid){
            read(STDIN_FILENO,a,sizeof(a));
            a=a[i-2]+a[i-1];
            write(STDOUT_FILENO,a,sizeof(a));
            }
        if(childpid) break;
    }   
    if(childpid==0){
        read(STDIN_FILENO,a,sizeof(a));
        a=a[i-2]+a[i-1];
        write(STDOUT_FILENO,a,sizeof(a));
        return 1;
    }
    else wait(NULL);
    if(fpid==getpid()){
        read(STDIN_FILENO,a,sizeof(a));
        for(i=1;i<n+1;i++)
            fprintf(stderr,"%d\n",a);
        fprintf(stderr,"\n",NULL);
    }
    return 0;
}
 
    通过进程环的编写,了解了进程和管道的一些知识,对操作系统用了进一步的了解。鉴于考试复习比较紧张,所以学习还不深入,同样有待加强。


   最后总结一句, 小组的学习氛围和学习环境非常好,无论是知识上的,还是学习方法上的,我都学到很多。我会珍惜这样的机会在以后更加好好学习。感谢老师和同学们的帮助!

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户518079 2009-4-10 16:23

楼主好厉害!

tengjingshu_112148725 2009-4-10 10:37

汗颜啊,大二就这样用功呢?
相关推荐阅读
用户197202 2010-06-30 18:58
FPGA(EDA)课程设计——交通灯(附源代码)
技术规范功能描述:实现一个由一条主干道和一条支干道的汇合点形成的十字路口的交通灯控制器,具体功能:(1) 主、支干道各设有一个绿、黄、红指示灯,两个显示数码管。(2) 主干道处于长允许通行状态,而支干...
用户197202 2010-04-23 16:33
我要考研了
        本人好久没有写博客了,主要是因为突然发现原来的方向自己不是很适合,而且自己出现了很严重的厌学情绪,所有的事情都变得很糟糕。上课听不进去,下课不想学习,前途一片茫然,把所有的心思都用在了...
用户197202 2010-04-03 23:29
考研进行中……开幕
     今天我第一次踏进了考研班的教室,一只脚刚迈入,便立刻有了一种压抑与窒息之感。看到那简陋的设备和拥挤着的占座位的人群,我一下开始怀疑选择考研是否明智。唉……不过令我意外的,课并不是我想象的那么...
用户197202 2010-04-01 20:29
改变
        人总是在不断的变化。    那些改变就像新陈代谢一样,外表只是缓慢地变化,身体里却有血液在奔腾。­       因为我们所经历每一件事,感受到的每一份情感,无时无刻不刺激着心脏,催促着...
用户197202 2010-04-01 20:27
我怀念过去单纯美好的小幸福
        我一直生活在美丽的房子里,看不到外面的世界。我生活得很安逸,对外面虽好奇却并不向往。有一天有人闯进了我的房子,帮我拉开了窗帘。我见到了美好的世界,我沉浸其中。我以为世界本就如此美好,我...
用户197202 2009-05-16 20:41
linux 套接字常用函数
计算机数据存储有两种字节优先顺序:高位字节优先和低位字节优先。Internet上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就需...
EE直播间
更多
我要评论
2
2
关闭 站长推荐上一条 /3 下一条