Linux程序设计实验报告.doc
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux程序设计实验报告
Linux程序设计实验报告姓名学号班级指导教师2008年3月实验一Linux基本命令的使用1、实验内容和步骤步骤1以user_login用户身份并使用telnet登录Linux 服务器login (输入username)password (输入密码)步骤2使用新创建的用户账户和口令登录Linux系统,察看登录后的界面。
Adduser tty1 步骤3使用pwd命令,然后用ls命令,使用-a,-l,-F,-A,-lF等不同选项并比较不同之处。
[rootteacher ] pwd /root ls anaconda-ks.cfg Documents install.log.syslog Pictures Videos chapter15 Downloads kk Public Desktop install.log Music Templates ls -a 显示出包含隐藏文件的所有文件ls -F 显示出当前目录下的文件及其类型ls -l 显示目录下所有文件的许可权、拥有者、文件大小、修改时间及名称ls -R 显示出该目录及其子目录下的文件步骤4在当前目录下建立一个名为test的新目录,然后将工作目录切换到test下,尝试将/etc目录下的文件passwd拷贝到该目录下(cp 源文件目的目录)。
察看当前目录下的passwd文件的属主和文件权限。
Mkdir test cp /etc/passwd test ls -l total 4 -rw-r--r--. 1 root root 2755 2010-06-11 1315 passwd 步骤5尝试向当前目录下的passwd文件和/etc/passwd文件分别写入一些新内容,用
cat命令浏览文件password的内容,用more命令进行浏览翻页操作,再用less命令浏览文件的内容。
可以cat passwd hello world cat passwd|more hello world cat passwd|lesshello world END 步骤6用ls命令查看test下文件的权限,用mv命令更改文件password的文件名为test.txt,尝试用chown和chgrp更改文件的属主为root、组为root,看看能否成功,不成功,请说明原因。
尝试用chomd将文件权限为“-rw-------”。
ls -l total 4 -rw-r--r--. 1 root root 12 2010-06-11 1318 passwd mv passwd test.txt [rootteacher test] l total 4 -rw-r--r--. 1 root root 12 2010-06-11 1318 test.txt chown test.txt root chown invalid user test.txt chgrp test.txt root chgrp invalid group test.txt chmod 12 test.txt 步骤7用rm命令删除test目录下的所有文件,再用rmdir命令删除test目录。
(想一想有没有一条命令将目录及目录下的所有文件删除,写出这条命令)rm test.txt rm remove regular file test.txt y [rootteacher test] l total 0 步骤8使用ps命令查看当前系统内的进程,并利用man命令获取ps命令的参数,写出获取当前终端进程执行情况的ps命令。
Ps -x 步骤9使用df命令查看当前系统已安装的文件系统的空间使用情况,记录结果。
Filesystem 1K-blocks Used Available Use Mounted on
/dev/sda1 20153140 6777992 12351408 36 / tmpfs 250752 272 250480 1 /dev/shm /dev/sda3 10662896 777488 9885408 8 /media/A1C5-D4A0 /dev/sdb1 1917228 1252344 664884 66 /media/FWW 步骤10使用du命令查看用户的工作目录占用了多少空间,记录结果。
9992 ./student/desk/1818/Linux实用教程10344 ./student/desk/1818 10488 ./student/desk 8 ./student/.qt 4 ./student/视频/Webcam 步骤11使用free命令查看内存资源的使用情况,记录结果。
total used free shared buffers cached Mem 501504 495180 6324 0 18112 208092 -/ buffers/cache 268976 232528 Swap 10233364 120184 10113180 步骤12使用man获取tar和gzip 的帮助信息,尝试将test目录下的文件打包并压缩,然后到另外一目录tmp下解包,写出这几条命令。
Tar cvf test *test gzip test gzip -d test 步骤13尝试执行“ls –l tmp”,看看这条命令的执行会出现什么结果,解释一下这条命令。
bash tmp Is a directory 将命令ls –l的结果输出重定向到目录tmp. 步骤14尝试执行find /usr/src -name *.c -print | xargs grep “include”,看看这条命令的执行会出现什么结果,解释一下这条命令。
无结果步骤15执行cal和date命令,说说这两条指令
的用途。
May 2010 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 查看日历Sat May 29 124359 EDT 2010 查看系统时间步骤16执行命令clear和logout,退出系统。
(想一想有没有其他的方法,写出这种方法)exit 步骤17执行命令shutdown,关闭系统。
(想一想有没有更简单的命令,写出这条命令)init 0 3、实验结论通过此次试验,进一步学习和掌握Linux的基本命令,收获颇多。
实验二简单Shell程序设计1、实验内容和步骤步骤1以root用户身份登录进入Linux 系统。
步骤2启动Vi,切换到输入模式,输入一段英文This ia an exercise We use Vi to edit it. Left,down,up,right 步骤3尝试匹配其中的一串字符,写出这命令及执行结果。
grep an kk This ia an exercise 步骤4尝试替换其中的一串字符,写出这命令及执行结果。
1. s/is/are/g Thare ia an exercise We use Vi to edit it. Left,down,up,right 步骤5尝试复制/删除其中的一行或几行文本,写出命令及执行结果。
2yy p 复制2行粘贴dd 删除行步骤6尝试复制/删除其中的一个单词或几个字符,写出命令及执行结果。
d w 删除到某个单词的结尾位置d 3 w 删除到第三个单词的结尾位置y w p删除到某个单词的结尾位置y 3 w p 删除到第三个单词的结尾位置步骤7尝试使用鼠标复制文本,写出命令及执行结果。
Ctrl c 步骤8尝试存盘退出操作,写出命令。
wq 2.2 简单的shell程序步骤1使用Vi将程序清单2-1的程序输入。
步骤1使用Vi将程序清单2-1的程序输入。
步骤2尝试运行该程序,如果不能运行,原因是什么,怎样修改。
Chmod 777 2-1 ./2-1 步骤3执行程序,写出程序的执行结果。
--------------------------------------------------------------------- Userroot Hostlocalhost Date29/05/10 --------------------------------------------------------------------- 1 List subdirectory in current directory 2 List files in current directory which can run 3 See who is on the system H Help screen Q Exit Menu -------------------------------------------------------------------- Your Choice [1,2,3,H,Q] 1 chapter14 chapter15 Desktop Documents Downloads kk Hit the return key to continue Your Choice [1,2,3,H,Q] 3 there are 3 users online who are root root root Hit
the return key to continue 步骤4阅读程序,掌握shell函数的编写方法,补全函数file_run。
步骤5修改程序中的函数uers,使得显示在线用户时不分行。
(提示可以使用循环,对每个在线用户分别处理。
)for name in who | awk {print 1} do printf “name “ done printf “\n“ Your Choice [1,2,3,H,Q] 3 there are 3 users online root root root 实验三Linux下简单C程序设计与文件操作1、实验内容和步骤步骤1使用Vi将程序清单3-1和3-2的程序输入,并在当前目录下创建文件“file.in”和文件“file.out”,尽可能的使文件“file.in”大一些。
步骤2利用gcc分别编译这两个程序,写出编译命令和执行结果,如果不成功,尝试利用gdb调试。
Gcc -o 3-1 3-1.c 步骤3仔细观察这两个程序,比较标准C的文件操作和Linux的系统调用open、read、write等的使用区别。
Open与fopen的参数有差别了。
open的打开模式是以O_RDONLY,O_WRONLY,O_RDWR.三种方式,fopen以“W”“r””w””r””rb””wb””ab”等多种方式。
Open还可以带有权限控制。
Read write与fread fwrite基本相同。
步骤4按照说明重新修改程序3-2,并使用time命令察看程序执行的时间效率上有何区改前linux-k1u9/linux/实验3 /usr/bin/time -p ./3-2 real 0.08 user 0.00 sys 0.06 改后linux-k1u9/linux/实验3 /usr/bin/time -p ./3-2 real 0.00 user 0.00 sys 0.00 步骤5输入、编译并运行程序3-3和3-4,并比较他们fseek和lseek在使用方法上的异fseek函数是lseek 系统调用等价文件流函数。
它在文件流里为下次读写操作指定位置。
只是两个返回值不同,lseek返回从文件头到文件指针被设置处的字节偏移值。
而fseek返回一个整数,0表示成功,-1表示失败并设置errno指出错误。
步骤6学习并分别使用标准C的文件操作函数和Linux 的系统调用创建一个对学生基本信息进行操作(插入、修改和删除)的C程序,学生基本信息以结构体的形式存储在文件中,struct stu_info的定义如下struct stu_info { char stu_num[12]; char name[10]; short int sex;/*0为女生,1为男生*/ char mobile_phone[12]; }; include include include include include struct stu_info { char stu_num[12]; char name[10]; char sex;/*0为女生,1为男生*/ char mobile_phone[12]; }; struct stu_info student; unsigned int number; struct stu_info stu[100]; FILE *in; FILE *out; int len; void inputstu; void updatestu; void
deletestu; void displaystu; void commanddisp { printf“-------------------------------------------------\n“; printf“|-----------学生基本信息管理--------------------|\n“; printf“|---1.基本信息插入.-----2.基本信息修改----------|\n“; printf“|---3.基本信息删除.-----4.基本信息显示----------|\n“; printf“|---r.初始化(第一次使用时用慎用)-q.退出---|\n“; printf“|--------------------请输入你的选择-----------|\n“; printf“-------------------------------------------------\n“; } void main { commanddisp; char ch; while1 { do{ chgetchar; }whilech \n ; ifch q return; switchch { case 1 inputstu; break; case 2 updatestu; break; case 3 deletestu; break; case 4 displaystu; break; case r printf“\ninit student table\n“; ifoutfopen“c.doc“,“w“NULL return; number0; fwrite fflushout; fcloseout; break; default break; } prin tf“please enter any key to continue“; getchar; getchar; system“clear“; commanddisp; } }void inputstu {printf“\n-----------------请输入学生信息----------------------\n“; char p y ; whilep y ||p Y { memset printf“学号“; scanf“s“,student.stu_num; printf“姓名“; scanf“s“,; printf“性别<0是女,1是男>“; do{ student.sexgetchar; }whilestudent.sex \n ; printf“手机号“; scanf“s“,student.mobile_phone;lensizeofstruct stu_info; ifoutfopen“c.doc“,“r“NULL return; fread umber;
fseekout,0L,SEEK_SET; fwrite fflushout; fseekout,0L,SEEK_END; fwrite fflushout; fcloseout; printf“是否继续输入Y/N\n“; fflushstdin; do{ pgetchar; }whilep \n ; } } void updatestu { printf“\n-------------------学生信息修改-------------------------\n“; printf“请输入修改学生的学号“; memset scanf“s“,student.stu_num; printf“姓名“; scanf“s“,; printf“性别<0是女,1是男>“; do{ student.sexgetchar; }whilestudent.sex \n ; printf”手机号“; scanf“s“,student.mobile_phone; l ensizeofstruct stu_info; infopen“c.doc“,“r“; fread //memsetstu,0,sizeofstu; //freadstu,len,number,in; unsigned int j; long kk; forj0;j 手机号\n“; fori0;i include include include include struct stu_info { char stu_num[12]; char name[10]; char sex;/*0为女生,1为男生*/ char mobile_phone[12]; }; struct stu_info student; unsigned int number; struct stu_info stu[100]; int pipefiles[2]; void main { printf“------------------------------------------------\n“; printf“|----------学生基本信息管理---------------|\n“; printf“|--1.基本信息插入.-----2.基本信息修改--------|\n“; printf“|--3.基本信息删除.-----4.基本信息显示--------|\n“; printf“|--r.初始化(第一次使用时用慎用)--------|\n“; printf“|--------------------请输入你的选择-----|\n“; printf“------------------------------------------------\n“; pid_t pid;
FILE *in; FILE *out; char ch; int len; ifpipepipefiles0 { pidfork; ifpid-1 {fprintfstderr,“Fork failure\n“; return; } ifpid0////child. { readpipefiles[0], switchch { case 1 while1 {sleep1; lensizeofstruct stu_info; char *ch1char*mallocsizeofchar*len; readpipefiles[0],ch1,len; ifout fopen“c.doc“,“r“NULL return; fread number; fseekout,0L,SEEK_SET; fwrite fcloseout; ifoutfopen“c.doc“,“a“NULL return; fwritech1,len,1,out; fcloseout; char f; readpipefiles[0], iff y } break; case 2 //while1 //{ sleep1; lensizeofstruct stu_info; pipefiles[0], fopen“c.doc“,“r“; unsigned int j; forj0;j c-手机号s-\n“,i,stu[i].stu_num,stu[i].name,stu[i].sex,stu[i].mobile_phone; printf“----------------------------------------------------------------------------\n“; fclosein; break; case r ifoutfopen“c.doc“,“w“NULL return; number0; fwrite break; default break; } } else////father. { do{ chgetchar; }whilech \n ; writepipefiles[1], switchch { case 1 printf“\n-----------------请输入学生信息----------------------\n“; char p y ; whilep y ||p Y {memset printf“学号“; scanf“s“,student.stu_num; printf“姓名“; scanf“s“,; printf“性别<0是女,1是男>“; do{ student.sexgetchar; }whilestudent.sex \n ; printf“手机号“; scanf“s“,student.mobile_phone; lensizeofstruct stu_info; writepipefiles[1], sleep1; printf“是否继续输入Y/N\n“;
fflushstdin; do{ pgetchar; }whilep \n ; writepipefiles[1], } break; case 2 printf“\n-------------------学生信息修改-------------------------\n“; printf“请输入修改学生的学号“; memset scanf“s“,student.stu_num; printf“姓名“; scanf“s“,; printf“性别<0是女,1是男>“; do{ student.sexgetchar; }whilestudent.sex \n ; printf“手机号“; scanf“s“,student.mobile_phone; lensizeofstruct stu_info; writepipefiles[1], sleep2; break; case 3 printf“\n-------------------学生信息删除-------------------------\n“; while1 { printf“请输入删除学生的学号“; char stu_num[12]; memsetstu_num,0,sizeofstu_num; fflushstdin; scanf“s“,stu_num; writepipefiles[1],stu_num,sizeofstu_num; sleep1; printf“是否继续删除Y/N\n“; fflushstdin; char f; do{ fgetchar; }whilef \n ; writepipefiles[1], iff y } break; case 4 printf“\n------------------------------显示学生信息----------------------------------\n“; sleep1; break; case r printf“\ninit student table\n“; sleep2; break; default break; } } } } 实验五Linux线程的使用1、实验内容和步骤步骤1输入程序5-1,编译并运行写出执行gcc -o 5-1 5-1.o -lpthread ./5-1 thread_function is running.Argument was 10 Waiting for thread to finish... Thread joined,it returned Thank you for the CPU time share_int is now -10 步骤2仔细研读代码,描述
pthread_create函数中各个参数的意义,并给出线程的入口函数的调用方法,描述两线程间参数传递的方式。
extern int pthread_create __P pthread_t *__thread, __const pthread_attr_t *__attr,void **__start_routine void *, void *__arg; 第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数. V oid *thread_function void *arg liang ge xian cheng ke yi gong xiang bian liang. 步骤3打开注释掉的全局变量aa及操作aa的相关代码,回答这跟进程有什么不同。
thread_function is running.Argument was 10 Waiting for thread to finish... Thread joined,it returned Thank you for the CPU time share_int is now -10 步骤4输入程序5-2,编译并运行,写出运行结果。
[rootteacher chapter12] vi 5-2.c [rootteacher chapter12] gcc -o 5-2 5-2.c -lpthread [rootteacher chapter12] ./5-2 Input some text,Enter end to finish fww You input 3 characters fanweiwei1989 You input 13 characters 步骤5学习并使用线程间的同步方法,重新改写实验3步骤6要求的程序。
要求启用两个线程,其中主线程接受用户对文件 的操作命令然后发给子线程,子线程完成对文件的实际操作(注意线程间的同步)。
实验六Linux进程间的IPC 1、实验内容和步骤步骤1输入程序6-1,6-2编译并运行写出执行结果。
Gcc -o 6-2 6-2.c -lpthread ./6-2 semid0 步骤2仔细研读代码,写出程序中实现P、V操作的相关函数和代码,描述程序的同步工作过程。
P操作static int semaphore_pvoid { struct sembuf sem_b; sem_b.sem_num 0; sem_b.sem_op -1; /* P */ sem_b.sem_flg SEM_UNDO; if semopsem_id, return0; } return1; } v操作static int semaphore_vvoid { struct sembuf sem_b; sem_b.sem_num 0; sem_b.sem_op 1; /* V */ sem_b.sem_flg SEM_UNDO; if semopsem_id, return0; } return1; } 步骤3输入程序6-3和6-4,编译执行并写出结果。
Gcc -o 6-3 6-3.c -lpthread ./6-3 init over 步骤4程序6-3和6-4中哪段代码实现了共享,描述实现内存共享的主要函数的参数意义和这些函数的使用方法。
key 1234; shmid shmgetkey,SHMSZ,0666 实验八Linux下网络编程1、实验目的学习和掌握socket函数的基本使用方法。
2、实验内容和步骤步骤1输入、编译并运行程序8-1和8-2,写出程序的执行结果。
Gcc -o 8-1 8-1.c gcc -o 8-2 8-2.c ./8-2 ./8-1 [rootteacher chapter15] ./8-2 server waiting Now,client request come in.
client_address 127.0.0.1 client_port 49090 client send hello world [rootteacher chapter15] ./8-1 enter some message hello world from server yes 步骤2学习并使用socket函数的基本使用方法,完善并重新改写前几个实验实现的程序。
要求用户在客户端实现数据操作请求的输入,然后上传到服务器端完成对数据库的实际操作。
同学在实现时应尽可能的使用前几个实验的成果,即应该包括多线程或多进程、数据库以及socket等。
Socket 创建一个套接字。
bind绑定端口号命名套接字。
connect客户端发出连接请求。
listen置子套接字为被动套接字,监听。
accept接受请求,返回一个新的套接字。