版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1浙江大学linux程序设计 姓名:方专业:计算机科学与技术学号:3110000155 一、列出10 个有关linux 程序设计的知识点(可以是函数、函数参数、表达式、系统变量、结构体成员等等),谈谈掌握此知识点的要领、难点、技巧、应用列举(程序语句或程序段),或能反映自己在学习过程中的应用 体 会 , 更 欢 迎 通 过 自 学 的 知 识 要 点 。 2014 年 9 月 10 日 前 发 到 :序号问题1 vi/vim编辑器使用方法和快捷键。这个虽然算不上是问题,但是是我觉得学习linux最先需要牢记和多多使用的。虽然 gedit 编辑器更为方便,但是在远程登录的情况下对 linux 主
2、机进行操作的时候没有图形界面只有vi/vim 这种命令行界面可以使用,而且根据我所学的课程,比如操作系统实验和嵌入式系统等,这种vi/vim 的使用是非常普遍而且频繁的,所以我认为学习linux 首先就要学会vi/vim 的使用方法,这会对以后的学习和程序开发提供莫大的便利,而且可以极大的提高效率。2 shell 编程的特殊变量,例如$0、$#、$*、$、$?、$、$!、$-、$_等等。熟练运用这些变量可以使程序的适应性更加广泛,比如可以通过给程序加参数的方法让同一个程序执行不同的功能,这样调用的话比程序中手动输入的效率要高,应用面也更加的广。3 makefile 文件的编写,包括语法,语义和
3、常用方法等。这个文件可以说是非常重要,用的也非常的多,像我这个学期设计了一个编译器,生成目标代码的时候大多都是靠 makefile 文件进行的,熟练的使用该文件可以让工作变得简单有序,可以合理有序的生成我们需要的目标文件,在linux 内核和其他地方也广泛应用,学好这个受益无穷。4 gdb 调试命令的使用。学习了很长时间的c,但是要说起gdb 的使用我自己也不是很熟练,这无疑是一个难点,因为gdb 的配置比较麻烦,需要和编译器和系统配合,而且调试过程比较繁琐。一般我都是采用在程序里加入print 命令来进行调试取代gdb 的,我觉得这是一个难点,但并不是太重要的地方。5 文件的二进制读写。一般
4、我们编程接触到的是文本文件的读写,但是要存特定数据结构的时候就要进行二进制的读写,所以掌握linux 下文件的二进制读写是很重要的,在编程的时候很多时候要用到。6 fork() 函数。这个函数在linux 下创建进程的函数,准确来说是复制一个当前的进程。需要仔细理解返回的两个函数值,通过这个值来确定自身是子进程还是父进程。如果想要执行不同的代码需要在fork 之后将新进程复写从而运行其他程序。7 熟练使用信号量和互斥锁。这两个东西是进程或者线程间相互通信用到的最多的东西,它可以防止数据的不同步性,使得两个进程同步,对数据的访问变得更加有序。搞清楚如何使用这个东西,可以更好的理解在很高的运算速度
5、和交替运算的情况下如何控制好多个线程对数据的访问。8 socket 套接字是我认为最常用也最好用的网络通信方法之一。它适应性广,不受平台和语言的限制,可以实现多平台的网络通信,也是写一般网络通信程序的主要使用内容。29 熟练使用apt-get 或 rpm 或 yum 来安装程序。 这三个命令分别对应几种不同的linux发行版,虽然自行编译源码也可以完成软件安装,但是目前最方便而且最易于维护的方法还是使用自带的软件源,所以相关的命令和方法一定要熟悉。10 linux 的库函数。在linux 下编写 c 语言程序的时候有很多系统自带的库函数可以使用,比如我下面程序中就用到了系统自带的访问硬盘和文件
6、的函数来实现一个ls程序,虽然这些库函数提供的功能较为基础和简单,但是正因为如此,能够让你一步一步实现自己想要的任何操作。二、程序设计应用题 (4 个完整的程序, 自己认为最好的程序, 认为最好的理由,希望有程序的运行结果)实验环境: mac os 10.9,fedora 20. 1.作业管理系统:这是一个简单的作业管理系统,用文件形式实现数据的存储,系统功能如下:l管理员:创建、修改、删除、显示(list)教师帐号;教师帐户包括教师工号、教师姓名,教师用户以教师工号登录。创建、修改、删除课程;绑定(包括添加、删除)课程与教师用户。课程名称以简单的中文或英文命名。l教师:对某门课程,创建或导入
7、、修改、删除学生帐户,根据学号查找学生帐号;学生帐号的基本信息包括学号和姓名,学生使用学号登录。发布课程信息。包括新建、编辑、删除、显示(list)课程信息等功能。布置作业或实验。包括新建、编辑、删除、显示(list)作业或实验等功能。查找、打印所有学生的完成作业情况。l学生:在教师添加学生账户后,学生就可以登录系统,并完成作业和实验。基本功能:新建、编辑作业或实验功能;查询作业或实验完成情况。shell 代码如下:#! /bin/bash # 管理员登录判断函数manager_login() echo 请输入管理员帐号:(输入q 退出系统) read man_no /dev/tty # 读入
8、帐号while 1 do if test -z $man_no #如果帐号为空,则重新输入then echo 帐号不能为空,请重新输入帐号: read man_no else break fi 3done if test $man_no = q # 判断是否为q,退出系统then exit 0 fi echo 请输入密码: # 读入密码read -s man_pwd while 1 # 如果密码为空,则重新输入do if test -z $man_pwd then echo 密码不能为空,请重新输入密码: read man_pwd else break fi done echo while r
9、ead line # 读入管理员帐号信息文件do if test $man_no = $line% * # 判断帐号密码是否正确then if test $man_pwd = $line#* then echo login successd. manager_work else break fi else continue fi done manager # 将文件 manager读入echo 帐号或密码错误! # 若帐号或密码错误,则重新输入manager_login # 教师登录判断函数teacher_login() echo 请输入教师帐号:(输入q 退出系统) read man_no
10、/dev/tty # 读入帐号while 1 do if test -z $man_no #如果帐号为空,则重新输入then echo 帐号不能为空,请重新输入帐号: read man_no else break fi done if test $man_no = q # 判断是否为q,退出系统then exit 0 4fi echo if -z cat teacher | grep $man_no # 判断帐号是否存在then echo 帐号不存在 teacher_login # 若不存在则重新登录else echo cat teacher | grep $man_no welcome! t
11、eacher_work $man_no # 若存在则登入fi # 学生登录判断函数student_login() echo 请输入学号:(输入q 退出系统) read man_no /dev/tty # 读入帐号while 1 do if test -z $man_no #如果帐号为空,则重新输入then echo 学号不能为空,请重新输入学号: read man_no else break fi done if test $man_no = q # 判断是否为q,退出系统then exit 0 fi echo echo if -z cat student | grep $man_no # 判
12、断学号是否存在then echo 学号不存在 student_login # 若不存在则重新输入else echo cat student | grep $man_no welcome! student_work $man_no # 若存在则登入fi # 管理员功能函数manager_work() while 1 do # 菜单选项:echo 教师帐号管理: echo (1)显示教师帐号 echo (2)创建教师帐号 echo (3)修改教师帐号 5echo (4)删除教师帐号 echo echo 课程管理: echo (5)查看课程 echo (6)创建课程 echo (7)修改课程 ech
13、o (8)删除课程 echo echo (9)退出系统 read input_1 /dev/tty if test $input_1 = 9 # 选择 9 则退出系统then exit 0 fi case $input_1 in 1) echo 教师工号教师姓名 # 显示教师帐号信息 cat teacher echo ; 2) echo 正在创建教师帐号. # 创建教师帐号 echo 请输入教师姓名: read name /dev/tty # 读入教师姓名,系统自动分配工号 while read line do t_no=$line% * done teacher # 创建成功之后输出结果 e
14、cho 创建成功,工号:$t_no 姓名: $name echo ; 3) echo 请输入要修改的教师帐号的工号: # 修改教师帐号信息 read no_1 /dev/tty tmp=cat teacher | grep $no_1 # 读入教师工号 if -z $tmp # 判断帐号是否存在then echo 修改失败:帐号不存在 # 不存在则提示else t_name=$tmp#* # 存在则读入并修改信息echo 请输入要修改的教师姓名: read name /dev/tty sed -i /$no_1/s/$t_name/$name/ teacher echo 修改成功 echo f
15、i ; 4) echo 请输入要删除的教师帐号工号: # 删除教师帐号 read no_2 /dev/tty if -z cat teacher | grep $no_2 # 判断读入的帐号是否存在then echo 帐号不存在 else sed -i /$no_2/d teacher # 存在则使用sed 从6文件中删除该信息echo 删除成功 echo fi ; 5) echo 课程号课程名称教师工号 # 查看课程信息 cat course echo ; 6) echo 正在创建课程. # 创建课程 echo 请输入要创建的课程名称: read c_name /dev/tty echo 请
16、绑定教师帐号: # 绑定教师帐号 read t_no /dev/tty tmp=cat teacher | grep $t_no # 判断帐号是否存在 if -z $tmp then echo 绑定失败:帐号不存在 else while read line #若存在则创建课程信息到course文件中 do c_no=$line% * done course mkdir $c_no # 并创建该课程号为名字的课程文件夹 mkdir $c_no/hw # 课程文件夹下有作业文件夹hw 存在作业信息 touch $c_no/course_info # course_info文件存放课程信息 touc
17、h $c_no/student # student存放该课程的学生信息 echo 课程创建成功 echo fi ; 7) echo 请输入要修改的课程代号: # 修改课程信息 read c_no /dev/tty tmp=cat course | grep $c_no if -z $tmp then echo 修改失败:课程不存在 else echo (1)修改课程名称 # 可以修改课程名称 echo (2)修改绑定教师帐号 # 或修改绑定教师帐号 read input /dev/tty case $input in 1) t_name=$tmp% * echo 请输入要修改的课程名: rea
18、d name /dev/tty sed -i /$c_no/s/$t_name/$c_no $name/ course echo 修改成功 echo 7; 2) t_num=$tmp#* echo 请输入要绑定的教师帐号 read t_no /dev/tty tmp=cat teacher | grep $t_no if -z $tmp then echo 绑定失败:教师帐号不存在 else sed -i /$c_no/s/$t_num/$t_no/ course echo 绑定成功 echo fi ; *) echo 请输入 1 或 2 ; esac fi ; 8) echo 请输入要删除的
19、课程号: # 删除课程 read no_3 /dev/tty if -z cat course | grep $no_3 # 根据课程号匹配课程信息then echo 课程不存在 else sed -i /$no_3/d course # 若存在则用sed 命令从 course用删除信息rm -rf $no_3 echo 删除成功 echo fi ; *) echo 请输入 1/2/3/4/5/6/7/8/9 ; # 若输入无效指令则提示esac done # 教师功能函数teacher_work() while 1 do # 菜单选项:echo 学生管理: echo (1)显示学生帐号 ec
20、ho (2)创建学生帐号 echo (3)导入学生帐号(批量) echo (4)删除学生帐号 echo echo 课程管理: echo (5)查看课程信息 echo (6)修改课程信息 echo (7)发布课程作业 echo (8)查看作业完成情况 echo (9)删除课程作业 echo echo (10 )退出系统 read input_1 /dev/tty 8if test $input_1 = 10 # 选择 10 则退出系统then exit 0 fi case $input_1 in 1) echo 您负责的课程有: # 显示学生帐号 echo 课程号课程名工号 # 先显示该教师绑定
21、的课程信息 cat course | grep $1 echo echo 请输入课程代号: # 选择进行操作的课程 read no /dev/tty if -z cat course | grep $no.*$1$ then echo 课程不存在 # 若课程不存在则提示,否则显示课程信息else echo 学号姓名 cat $no/student echo fi ; 2) echo 您负责的课程有: # 添加单个学生帐号 echo 课程号课程名工号 cat course | grep $1 echo echo 请输入课程代号: # 选择要添加学生帐号的课程 read no /dev/tty i
22、f -z cat course | grep $no.*$1$ then echo 课程不存在 else echo 请输入要添加的学生学号: # 从 student文件中选择要添加的学生学号read st_no $no/student echo 添加成功 mkdir stu/$st_no/$no cp $no/course_info stu/$st_no/$no echo fi fi ; 3) echo 您负责的课程有: # 批量导入学生帐号,上传文件实现 echo 课程号课程名工号 cat course | grep $1 echo echo 请输入课程代号: # 同样选择要进行操作的课程
23、read no /dev/tty if -z cat course | grep $no.*$1$ then echo 课程不存在 else echo 请输入要导入的学生名单的具体路径: read path $no/student 9echo 导入成功 #将文件导入while read line do s_no=$line% * mkdir stu/$s_no/$no cp $no/course_info stu/$s_no/$no done $path echo fi fi ; 4) echo 您负责的课程有: # 删除学生帐号 echo 课程号课程名工号 cat course | grep
24、 $1 echo echo 请输入课程代号: read no /dev/tty if -z cat course | grep $no.*$1$ then echo 课程不存在 else echo 请输入要添加的学生学号: # 输入学号read st_no/dev/tty if -z cat student | grep $st_no then echo 该学号不存在 else sed -i /$st_no/d $no/student echo 删除成功 # 删除信息并删除相关文件rm -rf stu/$st_no/$no echo fi fi ; 5) echo 您负责的课程有: # 显示课
25、程信息 echo 课程号课程名工号 cat course | grep $1 echo echo 请输入课程代号: read no /dev/tty if -z cat course | grep $no.*$1$ then echo 课程不存在 else echo 课程信息如下:(包括教室、作业和考试情况) cat $no/course_info echo fi ; 6) echo 您负责的课程有: # 修改课程信息 echo 课程号课程名工号 cat course | grep $1 echo echo 请输入课程代号: read no /dev/tty if -z cat course
26、| grep $no.*$1$ then echo 课程不存在 else echo 课程信息如下:(包括教室、作业和考试情况) cat $no/course_info echo 请输入新的课程信息: read infor $no/course_info # 直接进行文本的替10换,原信息将被覆盖echo 课程信息修改成功! while read line do s_no=$line% * # 更新学生文件夹中的课程信息cp $no/course_info stu/$s_no/$no done $no/student echo fi ; 7) echo 您负责的课程有: # 发布课程作业 ech
27、o 课程号课程名工号 cat course | grep $1 echo echo 请输入课程代号: read no /dev/tty if -z cat course | grep $no.*$1$ then echo 课程不存在 else echo 请输入要发布的作业名称: # 输入作业名称read hw_name $no/hw/$hw_name/hw_finish echo 请输入作业信息: read infor $no/hw/$hw_name/hw_info while read line do s_no=$line% * mkdir stu/$s_no/$no/$hw_name cp
28、 $no/hw/$hw_name/hw_info stu/$s_no/$no/$hw_name done $no/student echo echo 作业布置成功! echo fi ; 8) echo 您负责的课程有: # 查看作业完成情况 echo 课程号课程名工号 cat course | grep $1 echo echo 请输入课程代号: read no /dev/tty if -z cat course | grep $no.*$1$ then echo 课程不存在 else echo 已布置的作业有: # 显示已经布置的作业ls $no/hw echo 请输入要查看的作业名称: #
29、 输入作业名称read name /dev/tty if -z ls $no/hw | grep $name$ 11then echo 该作业不存在 else # 打印作业完成情况echo *如果名字后面没有“已完成”字样,则为未完成作业 * echo $name 完成情况如下: cat $no/hw/$name/hw_finish fi echo fi ; 9) echo 您负责的课程有: # 删除作业 echo 课程号课程名工号 cat course | grep $1 echo echo 请输入课程代号: read no /dev/tty if -z cat course | grep
30、$no.*$1$ then echo 课程不存在 else echo 已布置的作业有: ls $no/hw echo 请输入要删除的作业名称: read name /dev/tty if -z ls $no/hw | grep $name$ then echo 该作业不存在 else rm -rf $no/hw/$name # 删除作业信息并删除相关文件夹while read line do s_no=$line% * rm -rf stu/$s_no/$no/$name done $no/student # 包括删除学生文件夹里的相关文件夹echo 作业删除成功 fi echo fi ; *
31、) echo 请输入 1/2/3/4/5/6/7/8/9/10 ; esac done # 学生功能函数student_work() while 1 do echo 你修读的课程有: # 首先显示该学生修读的课程信息echo 课程号课程名教师工号 cat course | grep ls stu/$1 echo echo 请输入课程代号: # 并输入要进行操作的课程号read no /dev/tty 12if -z ls stu/$1 | grep $no$ then echo 课程不存在 else # 菜单选项:echo (1)显示课程信息 echo (2)显示作业信息 echo (3)提交
32、作业 echo (4)查询作业完成情况 echo echo (5)退出系统 read input_1 /dev/tty if test $input_1 = 5 # 选择 5 则退出系统then exit 0 fi case $input_1 in 1) echo 课程信息如下: # 显示课程信息 echo 课程号课程名教师工号 cat course | grep $no cat stu/$1/$no/course_info # 打印course_info文件 echo ; 2) echo 该课程的作业: # 显示作业情况 ls $no/hw echo echo 请输入作业名称: # 根据作业
33、名显示作业信息 read name /dev/tty echo if -z ls $no/hw | grep $name$ then echo 该作业不存在! else echo 作业信息如下: cat $no/hw/$name/hw_info # 打印 hw_info文件 fi echo ; 3) echo 该课程的作业: # 提交作业 ls $no/hw echo echo 请输入要提交作业的名称: read name /dev/tty echo if -z ls $no/hw | grep $name$ then echo 该作业不存在! else echo 请输入上传作业的具体路径:
34、read path /dev/tty # 读入作业上传的具体路径if -z ls -l $path then echo 该文件不存在 # 并拷贝到学生的作业文件夹和课程的作业文件夹else cp $path stu/$1/$no/$name cp $path $no/hw/$name echo 作业提交成功 sed -i /$1/s/$/& (完成 )/ $no/hw/$name/hw_finish echo # 并更新作业完成名单hw_finish fi 13 fi echo ; 4) echo 该课程的作业: # 查看作业完成情况 ls $no/hw echo 请输入要查看的作业名
35、称: read name /dev/tty if -z ls $no/hw | grep $name$ then echo 该作业不存在 else echo *如果名字后面没有“已完成”字样,则为未完成作业* echo $name 完成情况如下: cat $no/hw/$name/hw_finish # 打印 hw_finish文件 fi echo ; *) echo 请输入 1/2/3/4/5 ; esac fi done # 登陆函数login() # 登录菜单:echo (1) 管理员登录 # 管理员登陆echo (2) 教师登录 # 教师登陆echo (3) 学生登陆 # 学生登陆ec
36、ho (4) 退出系统 read input # 选择 4 则退出系统if test $input = 4 then exit 0 fi case $input in # 根据不同的选择登陆不同类型的帐号1) manager_login ; 2) teacher_login ; 3) student_login ; *)echo 请选择 1、2、3、4 ; esac # 主函数:调用login函数login exit 0; 14本程序看似复杂,实际上就是通过文件系统来实现存储并且使用了较多的判断和条件语句而已。2.这是一个 myls 的程序,实现了类似于linux 的ls命令,其中实现了-a
37、、-l、-i、-d 、-t、-f、-r等命令,并且没有用system() 函数调用 ls命令来实现,而是通过系统调用函数编写#include #include #include #include #include #include #include #include #include /* 用于表示选项的状态变量:如果参数中含有某个选项,则对应状态变量为1 */ int opt_a=0; /* option -a */ int opt_l=0; /* option -l */ int opt_i=0; /* option -i */ 15int opt_d=0; /* option -d */
38、 int opt_t=0; /* option -t */ int opt_f=0; /* option -f */ int opt_r=0; /* option -r */ /* 函数 void ls_attributes(struct stat buf) 用于打印具体文件信息的函数,对应选项-l */ void ls_attributes(struct stat buf) struct passwd *pwd; /* 存储 stat中用户名 */ struct group *grp; /* 存储 stat中组名 */ char time30; /* 存储时间信息 */ /* 打印文件类型:
39、 */ if(s_isdir(buf.st_mode) printf(d); else if(s_islnk(buf.st_mode) printf(l); else if(s_isreg(buf.st_mode) printf(-); else if(s_ischr(buf.st_mode) printf(c); else if(s_isblk(buf.st_mode) printf(b); else if(s_isfifo(buf.st_mode) printf(f); else if(s_issock(buf.st_mode) printf(s); /* 打印文件user权限: */ i
40、f(buf.st_mode & s_irusr) /* r */ printf(r); else printf(-); if(buf.st_mode & s_iwusr) /* w */ printf(w); else printf(-); if(buf.st_mode & s_ixusr) /* x */ printf(x); else printf(-); /* 打印 group权限 : */ if(buf.st_mode & s_irgrp) /* r */ printf(r); else printf(-); if(buf.st_mode & s
41、_iwgrp) /* w */ printf(w); else printf(-); if(buf.st_mode & s_ixgrp) /* x */ printf(x); else printf(-); /* 打印 others权限 : */ if(buf.st_mode & s_iroth) /* r */ printf(r); else printf(-); if(buf.st_mode & s_iwoth) /* w */ printf(w); else printf(-); if(buf.st_mode & s_ixoth) /* x */ prin
42、tf(x); 16else printf(-); printf( ); /* 打印链接数: */ printf(%6d ,buf.st_nlink); /* 打印用户名与组名: */ pwd = getpwuid(buf.st_uid); grp = getgrgid(buf.st_gid); printf(%-6s, pwd-pw_name); printf(%-6s, grp-gr_name); /* 打印文件的大小 */ printf(%6d,buf.st_size); /* 打印时间: */ strcpy(time, ctime(&buf.st_mtime); timestrl
43、en(time) - 1 = 0; /* 去掉 n */ printf( ); printf(%s , time); /* 函数 void ls_inode(struct stat buf) 用于打印文件inode号,对应 -i选项*/ void ls_inode(struct stat buf) /* 打印 inode号 */ printf(%6d ,buf.st_ino); /* 函数 list_single(char* path) 用于打印单个文件的信息*/ void list_single(char* path) int i,j=0,k=0; int len; char name200
44、,tmp200; struct stat buf; if(lstat(path,&buf)=-1) /* 文件有可能是链接文件,所以用lstat */ printf(error: %s: not exist.n,path); return ; len=strlen(path); if(pathlen-1=/) len-; /* 首先从传入的路径中获取文件名: */ for(i=len-1;i!=/&i=0;i-,j+) tmpj=pathi; for(i=j-1;i=0;i-,k+) 17namek=tmpi; namek=0; /* 根据 -f 选项修改文件名: */ if(
45、opt_f=1) if(s_isdir(buf.st_mode) /* 如果是目录,最后加“/ ” */ namek=/; namek+1=0; else if(s_islnk(buf.st_mode) /* 如果是符号链接,最后加“ ” */ namek=; namek+1=0; else if(s_isfifo(buf.st_mode) /* 如果是管道文件,最后加“| ”*/ namek=|; namek+1=0; /* 根据不同的命令选项情况打印文件信息: */ if(opt_a=0 & opt_l=0) /* 没有 -a也没有 -l */ if(name0!=.) if(op
46、t_i=1) /* 有-i选项时 */ ls_inode(buf); printf(%s ,name); else if(opt_a=0 & opt_l=1) /* 没有 -a ,有 -l */ if(name0!=.) if(opt_i=1) /* 有-i选项时 */ ls_inode(buf); ls_attributes(buf); printf(%s,name); printf(n); /* 当有 l 的时候,打完一行要换行 */ else if(opt_a=1 & opt_l=0) /* 有-a ,没有 -l */ if(opt_i=1) /* 有-i选项时 */ l
47、s_inode(buf); printf(%s ,name); else if(opt_a=1 & opt_l=1) /* 有-a ,有 -l */ if(opt_i=1) /* 有-i选项时 */ ls_inode(buf); ls_attributes(buf); printf(%s,name); printf(n); /* 当有 l 的时候,打完一行要换行 */ /* 18函数 list_dir(char* path,char* full_path) 用于打印目录文件的信息,包括处理递归遍历*/ void list_dir(char* path,char* full_path)
48、dir *dp; struct dirent *entry; struct stat buf,buf1; char filename1000200; /* 假设一个文件夹里最多只能有 1000个文件 */ char tmp200; char path_final200; /* 递归时完整的目录路径*/ int num=0; /* 文件个数 */ int i,j; if(dp=opendir(path)=null) /* 检查目录是否存在 */ printf(error: cannot open directory: %sn,path); return ; chdir(path); /* 进入目
49、录 */ while(entry=readdir(dp)!=null) /* 获取文件名 */ strcpy(filenamenum,entry-d_name); num+; /* 排序: */ if(opt_t=0) /* 如果没有 -t选项,则按字典序给文件名排序insert sort */ for(i=1;i0&strcmp(filenamej-1,tmp)0;j-) strcpy(filenamej,filenamej-1); strcpy(filenamej,tmp); else /* 如果有 -t选项,则按最后修改时间排序insert sort */ for(i=1;i0&
50、amp;buf.st_mtime-buf1.st_mtime0;j-) strcpy(filenamej,filenamej-1); lstat(filenamej-2,&buf); strcpy(filenamej,tmp); closedir(dp); /* 打印文件信息: */ dp=opendir(path); /* 重新打开目录 */ printf(%s:n,full_path); /* 打印路径 */ for(i=0;inum;i+) list_single(filenamei); /* 打印当前目录下的文件信息 */ 19printf(n); printf(n); if(
51、opt_r=1) /* 如果有 -r 选项 */ for(i=0;inum;i+) strcpy(path_final,full_path); lstat(filenamei,&buf); if(s_isdir(buf.st_mode) /* 如果是目录,则进行递归遍历 */ if(strcmp(.,filenamei)=0|strcmp(.,filenamei)=0) / * 忽略 .和 .*/ continue; strcat(path_final,/); strcat(path_final,filenamei); /* 获取完整路径 */ list_dir(filenamei,p
52、ath_final); /* 递归遍历目录 */ chdir(.); /* 返回上一级目录 */ closedir(dp); /* 主函数 */ int main(int argc,char* argv) int i,j,para_num=0; char para200200; /* 假设路径长度最多200 个字符 */ struct stat buf; char *tmp=./; /* 解析命令: */ for(i=1;iargc;i+) /* 先把命令参数保存起来*/ if(argvi0=-) /* 如果包含某选项,则对应状态变量置1 */ for(j=1;jstrlen(argvi);j
53、+) if(argvij=a) opt_a=1; else if(argvij=l) opt_l=1; else if(argvij=i) opt_i=1; else if(argvij=d) opt_d=1; else if(argvij=t) opt_t=1; else if(argvij=f) opt_f=1; else if(argvij=r) opt_r=1; else printf(my_ls: invalid option -%cn,argvij); break; else /* 若不是选项,则保存对应的文件参数 */ strcpy(parapara_num,argvi); 20
54、para_num+; if (para_num=0) /* 如果没有输入路径,则默认为当前目录 */ strcpy(para0, ./0); para_num+; if(opt_d=1) /* 如果有 -d选项 */ list_single(para0); else list_dir(para0,.); else for(i=0;ipara_num;i+) if(lstat(parai,&buf)=-1) /* 如果目标文件或目录不存在,则报错并退出程序 */ printf(error: %s: not exist.n,parai); return 1; if(s_isdir(buf.
55、st_mode) /* 如果参数是目录 */ if(opt_d=1) /* 判断是否有 -d 选项 */ list_single(parai); else list_dir(parai,parai); else /* 如果参数是文件,则打印单个文件信息 */ list_single(parai); return 0; 213.理发师问题的变体问题:有一个助教 (ta) , 在学生上机时ta 为学生解决操作系统实验中的问题。机房边上有一个小办公室供ta 使用 ,该办公室只能放一张桌子、一张椅和一台计算机 ,机房的走廊上有5 把椅子。ta 使用的办公室只能给一个学生答疑,当 ta 正在给某个学生解
56、答问题时 ,其他要答疑的学生只能坐在办公室外走廊的椅子上等待或者返回机房。ta 和学生互动关系如下:如果没有学生需要帮助,ta 坐在桌边睡觉 ; 如果一个学生到达办公室 ,发现ta 在睡觉 ,学生必须唤醒ta。如果一个学生到达看到 ta 正在帮助另一名学生 ,学生只能在走廊的椅子上坐着等;如果没有椅子可坐,该 学生返回机房继续编程,等一会再来。 ta 完成对一个学生帮助后,ta 必须检查是否有学生在走廊里的等待帮助 ,如果有 ,ta 必须帮助这些学生;如果没有学生 ,ta 返回到睡觉状态。 使用 posix 线程、互斥锁和信号量,编写程序实现ta 和学生的同步活动。这个程序进一步描述如下 :
57、使用pthreads 线程库的api 创建1 个 ta 线程 ,每 隔一定时间创建一个学生线程 ,共创建20 个学生线程。同一学生也可以间隔一段时间寻求ta 帮助。#include #include #include #include /重试最大间隔时间#define wait_time 5 /询问问题最大持续时间#define ask_time 6 /两个同学出现的最大间隔时间22#define max_time 2 int waiting = 0; /等待答疑的学生数int chairs = 5; /门口走廊的椅子数int waiter = 0; /正在排队的学生数pthread_mute
58、x_t mutex; /互斥锁,用来保证ta 只能被一个学生占用sem_t sem1, sem2; /分别用来实现学生排队等待回答问题和等待老师回答完问题void student(); /助教的执行代码void ta() printf(助教出现 n); while (1) printf(助教空闲 n); /等待学生sem_wait(&sem1); /将门口的学生叫进来一个pthread_mutex_trylock(&mutex); if (waiter 0) waiter-; printf(助教开始回答问题,门外还有%d 人等候 n, waiter); sleep(rand() % ask_time + 1); printf(回答完毕 n); sem_post(&sem2); pthread_mutex_unlock(&mutex); /学生的执行代码void student() int number = +waiting; /学生获取
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中教资面试化学结构化高频考题题库及答案
- 2026年初级电工照明线路漏电故障基础考试试卷及答案
- 2026年初级电工接触器不吸合故障识别考试试卷及答案
- 2026年三员培训考试试题及答案
- 2026年初级电工电机铭牌识读考试试卷及答案
- 2026年初级电工安全标识识别考试试卷及答案
- 2026年中考生物题库及答案
- 2026年创业投资基金行业市场现状分析报告及未来五至十年碳中和与循环经济
- 2026年放电式闪光灯装置行业洞察报告及未来五至十年发展趋势报告
- 2026年软件和信息技术服务行业市场调研报告及未来五至十年投资机会分析
- 2026年上海企业负责人a证模拟试卷目带答案
- 浙江宁波市2026-2027学年第一学期模拟考试高三语文试卷(含答案)
- 2026年江苏省职业院校技能大赛-高职组(药学技能赛项)考试题库(带答案)
- 2026年译林版五年级英语上册期中测试卷(含答案)-中等难度第10套-含答案解析
- 2026年《口腔颌面部外伤诊疗指南》
- 2026年新修订《中国共产党发展党员工作细则》逐条全文精讲(权威完整版)
- 墙面抹灰空鼓开裂修补方案
- 林木采伐专项施工方案
- 青岛水务集团招聘74人笔试试题
- 2026年价格鉴证师《法学基础知识与价格政策法规》真题及答案解析
- 肠道与健康-课件
评论
0/150
提交评论