浙江大学Linux程序设计实验报告(6)_第1页
浙江大学Linux程序设计实验报告(6)_第2页
浙江大学Linux程序设计实验报告(6)_第3页
浙江大学Linux程序设计实验报告(6)_第4页
浙江大学Linux程序设计实验报告(6)_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1浙江大学 linux 程序设计姓名:项庆琰专业:计算机科学与技术学号:3120100429 一、列出 10个有关 linux 程序设计的知识点 (可以是函数、 函数参数、表达式、系统变量、结构体成员等等) ,谈谈掌握此知识点的要领、难点、技巧、应用列举(程序语句或程序段) ,或能反映自己在学习过程中的应用体会,更欢迎通过自学的知识要点。 2015年 9 月 5 日前发到:序号问题1 知识要点bash bash 是一个为 gnu 计划编写的unix shell 。它的名字是一系列缩写:bourne-again shell 这是关于bourne shell(sh)的一个双关语(bourne ag

2、ain / born again) 。你可以检查一下/etc/shells 这个文件,至少就有底下这几个可以用的shells:/bin/sh (已经被/bin/bash 所取代 ) /bin/bash (就是linux 默认的shell) /bin/ksh (kornshell 由 at&t bell lab. 发展出来的,兼容于bash) /bin/tcsh (整合c shell ,提供更多的功能) /bin/csh (已经被/bin/tcsh 所取代 ) /bin/zsh (基于ksh 发展出来的,功能更强大的shell) shell script 大致都类同,当学会一种shell

3、 以后,其它的shell 会很快就上手,大多数的时候,一个shell script 通常可以在很多种shell 上使用。2 知识要点gdb gdb 是 gnu 软件系统中的标准侦错器,大部分类unix 操作系统上都可以使用gdb,gdb 具备各种侦错功效,能针对电脑程序的运行进行追踪与警告,使用gdb 的除错人员可以监督及修改程序的内部变量值,甚至监督与修改独立于主程序运作外,以独立个体型态调用(调用使用)的函数。熟悉使用gdb 在 linux c程序编写中十分重要,gdb 的使用使debug 过程变得更加简洁清晰。3 知识要点压缩文件、解压缩文件linux 中不仅有压缩文件命令,还有解压缩文

4、件命令。包括对文件的多种操作打包和压缩是两个概念。打包是指将一大堆文件或目录什么的变成一个总的文件,压缩则是将一个大的文件通过一些压缩算法变成一个小文件。为什么要区分这两个概念呢?其实这源于linux 中的很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你就得先借助另外的工具将这一大堆文件先打成一个包,然后再就原来的压缩程序进行压缩。linux 下最常用的打包程序就是tar 了,使用 tar 程序打出来的包我们常称为tar包, tar 包文件的命令通常都是以.tar 结尾的。生成tar 包后,就可以用其它的程序来进行压缩了2而打包好的文件可以使用gzip 命令来压缩,压缩后

5、的结果会存在一个文件中,使用原来的文件名加上gz 作为扩展名,压缩文件保留原文件的访问及修改时间,所有权与访问权限。原文件将会从文件结构中删除。4 知识要点linux 文件类型linux 文件类型常见的有:普通文件、目录、字符设备文件、块设备文件、符号链接文件等若用ls -lh 来查看某个文件的属性,若看到有类似-rw-r-r- 的文件在linux 中就是普通文件。用 ls 指令看到有类似drwxr-xr-x 的文件就是目录文件。属性类似crw-rw-rw- 以 c 打头的文件是字符设备文件。属性类似brw-r- 以 b 打头的文件是块设备。属性类似lrwxrwxrwx, 以 l 打头的文件文

6、件是链接文件。5 知识要点makefile make 工具最主要也是最基本的功能就是通过makefile 文件来描述源程序之间的相互关系并自动维护编译工作。而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。makefile 文件是许多编译器-包括windows nt 下的编译器 -维护编译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改makefile 文件而已。在 unix 系统中,习惯使用makefile 作为makefile 文件。 linux ( unix )环境下使用gnu 的 make

7、 工具能够比较容易的构建一个属于你自己的工程,整个工程的编译只需要一个命令就可以完成编译、连接以至于最后的执行。不过这需要我们投入一些时间去完成一个或者多个称之为makefile 文件的编写。所要完成的makefile 文件描述了整个工程的编译、连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建那些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。尽管看起来可能是很复杂的事情,但是为工程编写 makefile 的好处是能够使用一行命令来完成“自动化编译”,一旦提供一个(通常对于一个工程来说会是多个)正确的makefile 。编译整个工程你所要做的唯一的一件事就

8、是在shell 提示符下输入make 命令。整个工程完全自动编译,极大提高了效率。make 是一个命令工具,它解释makefile 中的指令(应该说是规则)。在makefile 文件中描述了整个工程所有文件的编译顺序、编译规则。makefile 有自己的书写格式、关键字、函数。像c 语言有自己的格式、关键字和函数一样。而且在 makefile 中可以使用系统shell 所提供的任何命令来完成想要的工作。makefile(在其它的系统上可能是另外的文件名)在绝大多数的ide 开发环境中都在使用,已经成为一种工程的编译方法。6 知识要点fork 函数fork()函数通过系统调用创建一个与原来进程几

9、乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。一个进程调用fork ()函数后,系统先给新的进程分配资源,例如存3储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。fork 调用的特点就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:1)在父进程中,fork 返回新创建子进程的进程id ;2)在子进程中,fork 返回 0;3)如果出现错误,fork 返回 -1;在 fork 函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个

10、是父进程。在子进程中,fork 函数返回0,在父进程中,fork 返回新创建子进程的进程id。我们可以通过fork 返回的值来判断当前进程是子进程还是父进程。7 知识要点grep 命令grep 的使用权限是所有用户。grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。grep 可用于 shell 脚本,因为 grep 通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的

11、文本处理工作。8 知识要点exce 函数族功能:用 exec 函数可以把当前进程替换为一个新进程,且新进程与原进程有相同的pid。exec 名下是由多个关联函数组成的一个完整系列,头文件 extern char *environ; 原型:int execl(const char *path, const char *arg, .); int execlp(const char *file, const char *arg, .); int execle(const char *path, const char *arg, ., char * const envp); int execv(con

12、st char *path, char *const argv); int execvp(const char *file, char *const argv); 参数:path 参数表示你要启动程序的名称包括路径名arg 参数表示启动程序所带的参数,一般第一个参数为要执行命令名,不是带路径且 arg 必须以 null 结束返回值 :成功返回 0,失败返回 -1 9 知识要点at 允许使用一套相当复杂的指定时间的方法。他能够接受在当天的hh:mm(小时 :分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。当然也能够使用 midnight (深夜), noon(中午),teatime(

13、饮茶时间,一般是下午4 点)等比较模糊的词语来指定时间。用户还能够采用12 小时计时制,即在时间后面加上am(上午)或pm(下午)来说明是上午还是下午。也能够指定命令执行的具体日期,指定格式为month day(月日)或 mm/dd/yy(月 /日/年)或 dd.mm.yy(日 .月 .4年) 。指定的日期必须跟在指定时间的后面。上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为: now + count time-units , now 就是当前时间,time-units 是时间单位,这里能够是 minutes(分钟)、hours(小时)

14、、days(天)、weeks(星期)。count 是时间的数量,究竟是几天,还是几小时,等等。更有一种计时方法就是直接使用today(今天) 、tomorrow (明天)来指定完成命令的时间。10 知识要点用 kill l 可显示程序进程的信号,以下是常见的信号的解析:1)sighup: 当用户退出shell 时,由该shell 启动的所有进程将收到这个信号,默认动作为终止进程2) sigint :当用户按下了ctrl+c 组合键时,用户终端向正在运行中的由该终端启动的程序发出此信号。默认动作为终止进程。3) sigquit :当用户按下ctrl+ 组合键时产生该信号,用户终端向正在运行中的由

15、该终端启动的程序发出些信号。默认动作为终止进程。4) sigill :cpu 检测到某进程执行了非法指令。默认动作为终止进程并产生core文件5) sigtrap :该信号由断点指令或其他trap 指令产生。默认动作为终止里程并产生 core 文件。6)sigabrt: 调用 abort 函数时产生该信号。默认动作为终止进程并产生core 文件。7) sigbus :非法访问内存地址,包括内存对齐出错,默认动作为终止进程并产生core 文件。8) sigfpe:在发生致命的运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为0 等所有的算法错误。默认动作为终止进程并产生core 文件。9)

16、 sigkill :无条件终止进程。本信号不能被忽略,处理和阻塞。默认动作为终止进程。它向系统管理员提供了可以杀死任何进程的方法。10)siguse1:用户定义的信号。即程序员可以在程序中定义并使用该信号。默认动作为终止进程。11)sigsegv :指示进程进行了无数内存访问。默认动作为终止进程并产生core文件。12)sigusr2 :这是另外一个用户自定义信号,程序员可以在程序中定义并使用该信号。默认动作为终止进程。1 13)sigpipe:broken pipe 向一个没有读端的管道写数据。默认动作为终止进程。14)sigalrm: 定时器超时,超时的时间由系统调用alarm 设置。默认

17、动作为终止进程。二、程序设计应用题(完整的程序,自己认为最好的程序,认为最好的理由,希望有程序的运行结果)1. #include int main(int argc, char* argv) fork(); fork() & fork() | fork(); 5fork(); printf(+/n); 为了更好地了解fork() 函数,所做的尝试。该程序计算了不算main 这个程序本身,程序到底创建了多少个进程。测试结果可以看出一共有20 个进程,除了main 程序一共有19 个进程。分析:该程序中,第一个fork 和最后一个fork 一定会得到执行而在中间三a&b ,如果 a

18、=0,就没有必要继续执行&b 了; a 非 0,就需要继续执行 &b 。a|b ,如果 a 非 0,就没有必要继续执行|b 了, a=0 ,就需要继续执行|b。fork() 对于父进程和子进程的返回值是不同的,按照上面的a&b和 a|b 的分支进行画图,可以得出5 个分支。个fork 中则要注意 & 和|运算符:画出流程图:2. 下面的这个脚本程序,我先用trap 命令使其在出现一个int (中断)信号时执行rm f/tmp/tmp_file_$ 命令以删除临时文件。然后使用while 循环,只要临时文件存在,这个循坏就会一直持续下去。当我按下ctrl+c ,程

19、序就会执行rm f/tmp/tmp_file_$ 语句,然后继续下一个循环。因为临时文件已经被删除了,所以第一个while 循环将会正常退出。接下来,脚本程序会再次调用trap 命令,这次是指定当一个int 信号出现时不执行任何命令。 脚本程序然后重新创建临时文件并进入第二个while 循环。这次当我按下ctrl+c 组合键时,没有语句被执行, 便采用默认处理方式,会立刻终止这个程序。因为程序被终止了,最后的 echo和 exit 语句永远都不会被执行。程序代码:#!/bin/sh process_gen1 process_gen2_1 process_gen2_2 process_gen3_

20、1 process_gen3_2 process_gen3_3 process_gen3_4 process_gen4_1 process_gen4_2 fork_1(return 0 ) fork_1(return 0 ) fork_2(return 0 ) fork_2(return = 0 ) fork_3(return 0 ) fork_3(return =0 ) fork_3(return 0 ) fork_3(return =0 ) 6trap rm -f /tmp/tmp_file_$ int echo creating file /tmp/tmp_file_$ date /tm

21、p/tmp_file_$ echo press interrupt (ctrl-c) to interrupt. while -f /tmp/tmp_file_$ ; do echo file exists sleep 1 done echo the file no longer exists trap int echo creating file /tmp/tmp_file_$ date /tmp/tmp_file_$ echo press interrupt (control - c) to interrupt . while -f /tmp/tmp_file_$ ; do echo fi

22、le exists sleep 1 done 程序运行结果3. #!bin/bash which dialog & /dev/null $? -ne 0 & echo dialog utility is not available, install it & exit 1 7deletetempfiles() rm -f *.$ show_time() dialog -backtitle menu driven program -title date & time -msgbox n todays date: date +%d-%m-%y nn todays t

23、ime: date +%r %z 10 60 show_cal() dialog -backtitle menu driven program -title calendar -msgbox cal 12 25 deletefile() dialog -backtitle menu driven program -title directory path -inputbox nenter directory path (absolute or relative) npress just enter for current directory 12 60 2 temp1.$ if $? -ne

24、0 then rm -f temp1.$ return fi 8rmdir=cat temp1.$ if -z $rmdir then dirname=$(pwd) # you can also use pwd rmdir=$dirname/* else # remove trailing * and / from directory path echo $rmdir | grep *$ & /dev/null & rmdir=$rmdir%* echo $rmdir | grep /$ & /dev/null & rmdir=$rmdir%/ # check

25、supplied directory exist or not ( cd $rmdir 2&1 | grep no such file or directory & /dev/null ) # above codeblock run in sub shell, so your current directory persists. if $? -eq 0 then dialog -backtitle menu driven program -title validating directory -msgbox n $rmdir: no such file or director

26、y nn press enter to return to the main menu 10 60 return fi # do you have proper permissions ? ( cd $rmdir 2 /dev/null ) 9if $? -ne 0 then dialog -backtitle menu driven program -title checking permissions -msgbox n $rmdir: permission denied to access this directory nn press enter to return to the ma

27、in menu 10 60 return fi if ! -r $rmdir then dialog -backtitle menu driven program -title checking permissions -msgbox n $rmdir: no read permission nn press enter to return to the main menu 10 60 return fi dirname=$rmdir rmdir=$rmdir/* fi for i in $rmdir do # store all regular file names in temp2.$ i

28、f -f $i then echo $i delete? temp2.$ 10fi done if -f temp2.$ then dialog -backtitle menu driven program -title select file to delete -menu use up/down keys to move, then press enter nfiles under directory $dirname: 18 60 12 cat temp2.$ 2 file2delete.$ else dialog -backtitle menu driven program -titl

29、e select file to delete -msgbox nn there are no regular files in $dirname directory 10 60 return fi rtval=$? file2remove=cat file2delete.$ case $rtval in 0) dialog -backtitle menu driven program -title are you sure -yesno ndo you want to delete file: $file2remove 7 70 if $? -eq 0 then rm -f $file2re

30、move 2 errorfile.$ 11if $? -eq 0 then dialog -backtitle menu driven program -title information : file deleted -msgbox nfile : $file2remove deleted 8 70 else dialog -backtitle menu driven program -title information : error on deletion -msgbox nproblem in deleting file: $file2remove nnerror: cat error

31、file.$ nnpress enter to return to the main menu 12 70 fi else dialog -backtitle menu driven program -title information : deletion aborted -msgbox action aborted: nn $file2remove not deleted 8 70 fi ; *) deletetempfiles return ; esac deletetempfiles return currentusers() who userslist.$ dialog -backt

32、itle menu driven program 12-title currentl y logged in users list -textbox userslist.$ 12 60 diskstats() df -h | grep / statsfile.$ dialog -backtitle menu driven program -title disk statistics -textbox statsfile.$ 10 60 trap deletetempfiles exit # calls deletetempfiles function on exit while : do di

33、alog -clear -backtitle menu driven program -title main menu -menu use up/down key to move 12 60 6 date_time to display date and time calendar to display calendar delete to delete files users to list currently logged in users disk to display disk statistics exit to exit 2 menuchoices.$ retopt=$? choi

34、ce=cat menuchoices.$ 13case $retopt in 0) case $choice in date_time) show_time ; calendar) show_cal ; delete) deletefile ; users) currentusers ; disk) diskstats ; exit) clear; exit 0; esac ; *)clear ; exit ; esac done 对 linux 这种复古的图形界面很感兴趣,写的linux 图形界面程序菜单栏,一共有几种功能,显示当前时间,显示日历,删除文件,显示当前登录用户,显示硬盘储存状态

35、,以及退出。显示当前时间:14显示日历:删除文件15键入文件目录后可以删除文件显示当前登录用户:16显示硬盘状态:4. shell下的 cd唱片管理程序该程序可以实现以下功能添加唱片(包括唱片信息:唱片名、歌手、流派等等)查找唱片。统计唱片和歌曲数量。将唱片、歌曲信息保存在一个txt文件中。#!/bin/bash menu_choice= current_cd= title_file=title.cdb 17tracks_file=tracks.cdb temp_file=/tmp/cdb.$ trap rm -f $temp_file exit get_return() echo -e pr

36、ess return c read x return 0 get_confirm() echo -e are you sure? c while true do read x case $x in y | yes | y | yes | yes ) return 0; n | no | n | no | no ) echo echo cancelled return 1; *) echo please enter yes or no ; esac done set_menu_choice() clear echo options :- echo echo a) add new cd echo

37、f) find cd echo c) count the cds and tracks in the catalog if $cdcatnum != ; then echo l) list tracks on $cdtitle echo r) remove $cdtitle echo u) update track information for $cdtitle fi echo q) quit echo 18echo -e please enter choice then press return c read menu_choice return insert_title() echo $

38、* $title_file return insert_track() echo $* $tracks_file return add_record_tracks() echo enter track information for this cd echo when no more tracks enter q cdtrack=1 cdttitle= while $cdttitle != q do echo -e track $cdtrack, track title? c read tmp cdttitle=$tmp%,* if $tmp != $cdttitle ; then echo

39、sorry, no commas allowed continue fi if -n $cdttitle ; then if $cdttitle != q ; then insert_track $cdcatnum,$cdtrack,$cdttitle fi else cdtrack=$(cdtrack-1) fi cdtrack=$(cdtrack+1) done 19add_records() echo -e enter catalog name c read tmp cdcatnum=$tmp%,* echo -e enter title c read tmp cdtitle=$tmp%

40、,* echo -e enter type c read tmp cdtype=$tmp%,* echo -e enter artist/composer c read tmp cdac=$tmp%,* echo about to add new entry echo $cdcatnum $cdtitle $cdtype $cdac if get_confirm ; then insert_title $cdcatnum,$cdtitle,$cdtype,$cdac add_record_tracks else remove_records fi return find_cd() if $1

41、= n ; then asklist=n else asklist=y fi 20cdcatnum= echo -e enter a string to search for in the cd titles c read searchstr if $searchstr = ; then return 0 fi grep $searchstr $title_file $temp_file set $(wc -l $temp_file) linesfound=$1 case $linesfound in 0) echo sorry, nothing found get_return return

42、 0 ; 1) ; 2) echo sorry, not unique. echo found the following cat $temp_file get_return return 0 esac ifs=, read cdcatnum cdtitle cdtype cdac $temp_file mv $temp_file $tracks_file echo add_record_tracks fi return count_cds() set $(wc -l $title_file) num_titles=$1 set $(wc -l $tracks_file) num_tracks=$1 echo found $num_titles cds, with a total of $num_tracks tracks get_return return 22remove_records() if -z $cdcatnum ; then echo you must select a cd first find_cd n fi if -n $cdcatnum ; then echo you are about to delete $cdtitle get_confirm & grep -v $cdcatnum, $title_file $temp_f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论