还剩19页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
Unix/Linux操作系统实验报告实验项目实验
五、语言编程Linux C、实验目的
1.理解系统调用和库函数的异同
2.掌握用系统调用和库函数进行编程
3.掌握一些常用的系统调用和库函数的功能及应用roo[@MyM;/mailong/tqstc/exp5/part2/2#Is nakefileprocesl.c|二joot@MVM:/mailong/testc/Rp5/part2/2^|make qccprocesspFocess.c|rootaMVM:/mailong/testc/exp5/part2/2#Is makefileprocessprocess.crootgMVM:/mailong/testq/exp5/part2/2#./process Parent1s pid=4354childs pid=4355-----------rootaMVM:/mailong/testc/exp5/part2/2#Is makefile|process|process.c[test Jroot@MVM:/mailong/^Ktc/exp5/part211#vi test岛root@M\/M:/mailonci/t~^£XD5/Ddrt2”{cat testwho areyou\I amyour parent.\who areyou I am child.root@MVM:/mailong/testc/exp5/part2/2#代码如下#includestdio.h#includeunistd.h#includestring.h#includesys/types.h#includesys/stat.h#includefcntl.hint main int argc,char*argv口int pid=0;int fd=0;char str
[100]=who areyou\r\n〃;char filename
[100]=test;char strParent[]=〃I amyour parent.\r\n\r\n,/;char strChild[]=〃I amchild.\r\n\r\n/z;//open filefd=openfi1ename,0_CREAT10_RDWRif fd==-1//create processpid=fork;//Great process failedif-1==pid printf Z/Creat firstprocess failed!\n\nz/;close fd;return0;}//in parent,s process pid==child,s pidif pid!=0printf Parentspid=%d\n\n〃,getpid;write fd,str,strlen str;writefd,strParent,strlenstrParent;;wait;}//in childs process pid==0else{printf childspid二%d\n\n/z,getpidO;write fd,str,strlen str;writefd,strChild,strlenstrChild;if fd!=-1close fd;fd=-1;return0;第三部分进程通信编程
3.1进程的管道通信编写程序实现进程的管道通信使用系统调用pipe建立一个管道,二个子进程P1和P2分别向管道各写一句话Child1is sendinga message!Child2is sendinga message!父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,再接收P2)oQO0root@MVM:/mailong/testc/exp5/part3root@MVM:/mailong/testc/exp5/part3加gcc二o process process・crootfdMVM:/mai Ion°/testc/exp5/part3#Is|process processroot@MVM:7mdiIonq/testc/exp5/pdrt3#•/processRead childl:Child2is sendinga messageReadchild2:Child1is sendinga messageroot@MVM:/mailong/testc/exp5/part3#|代码如下#includestdio.h#includeunistd.h#includestring.hint main int argc,char*argv口int pid=0;int pipefd
[2];int flag=0;int Size=100;char strChildl[]=Child1is sendinga message!char strChild2[]=Child2is sendinga message!char buffer
[100]=〃〃;//pipefd
[0]read endof thepipe.//pipefd[l]write endof thepipe.//Greate pipeflag=pipepipefd;if flag==-1{printf Create pipe failed!\n\n7;return0;}//Create processpid=fork;//Great process failedif-1==pid printfCCreat firstprocess failed!\n\n,z;return0;//in parent,s process pid==child onepid ifpid!=0pid=fork;if-1==pid{printf Greatsecond process failed!\n\nz,;return0;//in parent5s process pid==child twopidif pid!=0readpipefd
[0],buffer,Size;printf Readchildl:%s\n\n/z,buffer;memsetbuffer,0,Size;readpipefd
[0],buffer,Size;printf Readchild2:%s\n\n/z,buffer;closepipefd
[0];closepipefd[l];//printf〃father\n\n〃;}//in child two process pid==0elsewritepipefd[l],strChild2,strlenstrChild2//printf childtwo\n\n〃;//in child one processpid=0else{sleepl;writepipefd[l],strChildl,strlenstrChildl;//printf/zchild one\n\n〃;return02进程间使用信号通信编写一个程序,他创建一个子进程父进程向子进程发送一个信号,然后等待子进程终止;子进程接收信号,输出自己的状态信息,最后终止自己程序运行效果如下60root@MVM:/mailong/testc/exp5/part3/2root@MVM:/mailong/testc/exp5/part3/2#Is process.c___________________,root@MVM:/mailong/testc/exp5/part3/2可^cc二o processprocess.E|root@MVM:/mailong/testc/exp5/part3/2#Isprocess process.cEntey child process...Enter mywait.myf unwas involed!./processExit mywait.Child processis exitting...root®mailong/tesiParent processis exitting...程序的代码如下#includestdio.h#includeunistd.h#includestring.h#includesignal.hint status=0;void myfun;void mywait;int mainintargc,char*argv[]int pid=0;int flag=0;//Create processpid=fork;//Great processfailedif-1==pid printf/zCreat processfailed!\n\nz/;return0;//in parent,sprocesspid==child pidifpid!=0//this stepis veryimportant sleepl;//Send messageto childprocesskill pid,17;//waitting forchildprocessexitwait0;printf Z/Parent processis exitting...\n\n〃;//in childprocesspid0二二else{printf Z/Entey childprocess...\n\n〃;//take overoriginal functionsignal17,void*myfun;//waitting forsignalmywait;//sleepl;printf Z/Child processis exitting...\n\n/z;return0;void myfunprintf z,myfun wasinvoled!\n\n〃;status=1;void mywaitprintfEnter mywait.\n\n〃;whi1estatus==0printf Exitmywait.\n\n〃;3阅读下列程序,分析程序功能ttinclude sys/wait.httinclude stdio.httinclude stdlib.h ttincludeunistd.h ttincludestring.hint mainintargc,char*argv[]int pipefd
[2];pid_t cpid;char buf;if argc!=2{fprintfstderr,“Usage:%s string\n argv[O];exitEXIT_FAILURE;〈〃,}if pipe pipefd-1{=二perrorpipe;exitEXIT_FAILURE;cpid=fork;if cpid==-1{perror〃fork〃;exitEXIT_FAILURE;if cpid==0{/*Child readsfrom pipe*/closepipefd[l];/*Close unusedwrite end*/while readpipefd
[0],buf,10writeSTD0UT_FILEN0,buf,1;writeSTDOUT_FILENO,〃\n1;closepipefd
[0];〃,_exitEXIT_SUCCESS;}else{/*Parent writesargv[l]to pipe*/closepipefd
[0];/*Close unusedread end*/writepipefd[l],argv[l],strlenargv[l];closepipefd[l];/*Reader willsee EOF*/waitNULL;/*Wait forchild*/exitEXIT_SUCCESS;以上程序运行的效果如下:QG0root@MVM:/mailong/testc/exp5/part3/3root@MVM:/mailong/testc/exp5/part3/3#Is analyze.c・|root@MVM:/mailorg/testc/exp5/part3/3#|gcc oanalyze analyzec|root@MVM:/mailonci/tFstc/exD5/Dart3/3#Isanalyze analyze.c__________root@MVM:/mailonq/testc/exp5/part3/3#./analyze口2345678习]123467891----------------root@MVM:/mailong/testc/exp5/part3/3#程序所完成的功能是把用户输入的参数输出出来综合训练题:
4.编写一个程序,把一个文件的内容复制到另外一个文件上,即实现简单的copy功能要求使用多线程(进程)技术和管道技术(选做)root0MVM:/mailong/testc/exp5/part3/4root@MVM:/mailong/testc/exp5/part3/4#Is copy.c・,rootaMVM:/mailong/testc/exp5/part3/4#Ircc ocopy coon.c IrootQMVM:/mailong/testc/exp5/part3/4#Is copy copy.crootQMVM:/mailong/testc/exp5/part3/4#匚/copycopy.c text「c rootOMVM:Iscopy copy,c|tex^^nlrootaMVM:/mailong/tesic/exp5/part3/4#.#includestdio.h#includeunistd.h#includestring.h#includesys/types.h#includesys/stat.h#includefcntl.hint mainintargc,char*argv[]{int pid=0;int flag=0;int pipefd
[2]={-1,-1;int fdRead=-1;int fdWrite=-1;int WritedSize=0;int ReadedSize=0;int ReadSize=100;char buffer[100+4]=〃〃;//pipefd
[0]read endof thepipe.//pipefd[l]writeendof thepipe.//Greate pipeif argc!=3printf Z/Input parametererror:argc=%d\n〃,argc;printf/zUsage:[Filename][SourceFile][Dest inationFi1e]\n〃;return0;flag=pipepipefd;if flag==-1{printf Z/Createpipe failed!\n\n,z;return0;fdRead=openargv
[1],O RDONLY;iffdRead=0printfz/0pen sourcefile failed!\n\n〃;goto FatalError;fdWrite=open argv
[2],0_RDWR|0_CREAT,0666;iffdWrite〈二0{printf z/0pen destinationfile failed!\n\nzz;goto FatalError;//Create processpid=fork;//Great processfailedif-1==pid printf Z/Creat firstprocessfailed!\n\n/z;goto FatalError;//in parent,sprocesspid childpid二二ifpid!=0whileReadedSize=readfdRead,buffer,ReadSize0ifReadedSize0printf/zread message from file failed!\n\nz,;goto FatalError;//writting messageto pipewritepipefd[l],buffer,ReadedSize;//in childprocesspid==0else//sleep
0.01;while ReadedSize=readpipefd
[0],buffer,ReadSize0if ReadedSize0{printf readmessagefrompipefailed!\n\nz,;goto FatalError;//writing messageto filewritefdWrite,buffer,ReadedSize;FatalError:if pipefd
[0]!=T closepipefd
[0]pipefd
[0]=-1;if pipefd[l]!=T{closepipefd[l]pipefd[l]=-1;if pid!=0fdRead!=-1
二、实验环境在Windows
8.1Pro,64-bit Build
96006.
3.9600的真机上实验一的基础上安装了VMware®Workstation
11.
0.0build-2305329,在VMware中安装了32位的Linux操作系统Linux MVM
3.
2.0-23-generic-pae#36-Ubuntu SMPTue Apr1022:19:09UTC2012i686i686i386GNU/Linux,vim的版本是version
7.
3.429,使用的用户是root账户
三、实验内容及步骤第一部分使用系统调用对文件进行操作
1.1利用open函数创建文件在・/tmp目录下调用open函数,以可读可写的方式创建hello,c文件open函数带有3个flag参数0_CREATE、OJTRUNC、0_WR0NLY,文件权限设置为0600root@MVM:/mailong/testc/exp5#rootQMVM:/maong/testc/exp5#Isnyopen myopen.crooT^MVM r7maTlong/testc/exp5#./myopenrwt@MVM:/mei1Isfiello.c]myopen myopen.crootaMVM:/inailong/testc/exp5#Is-al hello.c画-------------1root root0May1922:49hello.croo1:@MVM/mailong/testc/exp5#代码如下#includestdio.h#includesys/types.h#includesys/stat.h#includefcntl.h intmain intfd=0;char file
[100]=hello.c〃;fd=openfile,0_CREAT10_TRUNC10_WR0NLY,S_IRUSR|S_IWUSR iffd=0//in parentprocessclose fdRead;fdRead=-1;ifpid==0fdWrite!=-1//in childprocessclose fdWrite;fdWrite=-1;}return0;
四、实验总结通过这次的Linux实验,让我确实收获了很多,不管是在熟练掌握Linux操作系统上还是Linux下的C语言编程,都让我学到了很多,也花了我很多的时间来做这些实验,不过这些实验确实能够对我的Linux编程能力有很大的提升特别是在做最后这个实验的时候,这个实验室比较综合型的实验,几乎需要用到前面实验的所有知识,前面几个实验知识为这个实验做一个铺垫而已,其实正真有分量的就是这个实验,因为这实验用到的知识特别的多,包括基本的vi编辑器的使用,Linux下的编译工具GCC的使用,已经Linux下的调试器GDB的使用,这写都知识这个实验的一些前提,都只是基础,C语言的编程才是这个实验的关键,首先就是一些基本的系统调用,比如open函数,read函数,write函数,close函数,以及高级一点的fork函数,kill函数,signal函数,等等,实验要求我们熟练掌握这些函数的使用,实现以下简单的功能,比如文件的的复制,文件的读写操作,管道的通信等等,这些都是需要我们掌握的通过这个综合性的实验,我也基本上掌握了这些函数的使用,可以做一些简单的开发了,以后若要在Linux上做开发,这些都是前提所以基础很重要,需要有坚实的基础printfZ/Open file failed!\n\nz/return0;}return0;2利用open创建文件并写入数据打开open函数创建的文件,然后对此文件进行读写操作,写入Hello!I amwritingto this file!”,此时文件指针位于文件尾部接着再使用Iseek函数将文件指针移动文件开始处,并读出10个字节并将其打印出来QO0root^JMVM:/mailong/testc/exp5・rQotOMVM:/mai1Is hello.c myopen myopen
2.c myoperc|root@MVM:/mailong/testc/exp5#|gcc myopen
2.c-o myopen2root@MVM:/mailorq/testc/xp5#Is「磊市ello.c myopen|myopen2|myopen
2.c myopen.c|root©./i cnj/lrMVM叶「匚揖『》/xpW]/yopen]Readed fromhello.c:Hello!I amroot@MVM:/mailong/testc/exp5#代码如下#includestdio.h#includesys/types.h#includesys/stat.h#includefcntl.h#includeunistd.h#includestring.h intmainintfd=0;int WritedSize=0;int ReadedSize=0;int ReadSize=10;char buffer
[100]=〃〃;char file
[100]=hello.c〃;char str
[100]=,zHello!I amwriting tothisfile!”//fd=openfile,0_CREAT10_TRUNC10_WR0NLY,S_IRUSR|S_IWUSR fd=open file,O_RDWR|OJTRUNC,S_IRUSR|S_IWUSR;iffd=0printf/z0pen file failed!\n\nz/;return0;WritedSize=writefd,str,strlenstr;ifWritedSize=0printfZ/Write filefailed!\n\nz,;close fd;return0;if-1==lseekfd,0,SEEK_SET{printf z,seek filefailed!\n\n〃;ReadedSize=readfd,buffer,ReadSize;if ReadedSize10=二printfZ/Readed from%s:%s\n\nzz,file,buffer;}else printf,zReaded from%sfailed:readed size=%d\n\n/z,file,ReadedSize;closefd;return0;3利用系统调用实现copy功能编写一个程序,把一个文件的内容复制到另外一个文件上,即实现简单的copy功能要求:只用open,read,write和close系统调用,程序的第一个参数是源文件,第二个参数是目的文件root0MVM:/mailong/testc/exp5/part1/3:/mailong/testc/exp5/partl/3#Is・hello cmyopen c|・root@MVM:/mailong/testc/exp5/part1/3#|gcc-o myopenmyopen Froot@MVM:/mailog/testc/exp5/part1/3#ishello二c[myopen]myopen•c|「oot@MVM:/mailonq/testc/exp5/partl/3#「/myopen hellolcnew.c|Zopy file[hello.c]to[new.c]success!Zopied size=89\root@MVM:/mailonq/testc/e\p5/partJ/3#Is hello•£myop/nmyopen・c匚pew.c」|root@MVM:/mailonci/testc/e^/Darn73#[c*new.c IHello,my nameismailong,how areyou,Iamfine,nice tomeet you!WLNice tomeet youtoo!rootaMVM:/mailong/testc/exp5/part1/3##includestdio.h#includesys/types.h#includesys/stat.h#includefcntl.h#includeunistd.h#includestring.hint mainintargc,char*argv[]{int i=0int fdRead=0;int fdWrite=0;int WritedSize=0;int ReadedSize=0;int ReadSize=10;long TatolCopied=0;char buffer
[100]二〃〃;//char myargl
[100]=hello.c〃;//char myarg2
[100]=newhello.c〃;ifargc!=3{printfInput parametererror:argc%d\n argc;二〃,printf〃[Filename][SourceFile][DestinationFi1e]\n〃return0;for i=0;iargc;i++printf/zargv[%d%s\ni,argv[i];二〃,fdRead=openargv
[1],O RDONLY;//fdRead=open myargl,0RDONLY;if fdRead0〈二|printf/z0pen sourcefilefailed!\n\n〃;return0;fdWrite=open argv
[2],O_RDWR|O_CREAT;//fdWrite=open myarg2,ORDWR|OCREAT;iffdWrite=0{printfz/0pen destinationfilefailed!\n\nzz return0;whileReadedSize=readfdRead,buffer,ReadSize0|ifReadSize0〈二{printf readfilefailed!\n\n/z;closefdRead;closefdWrite;return0;WritedSize=writefdWrite,buffer,ReadedSize;if WritedSize=0printfz,write filefailed!\n\n,z;closefdRead;closefdWrite;return0;TatolCopied+=WritedSize;printf CCopy file[%s]to[%s]success!\n\nz\argv[l],argv
[2]//printf z,Copyfile[%s]to[%s]success!\n\n/z,myargl,myarg2printf^Copied size=%ld\n\nz/,TatolCopied;closefdRead;closefdWrite;return0;}第二部分使用系统调用对进程进行控制
2.1可以用一些Linux命令操作和管理进程
1.用ps命令观察Linux正在运行的进程(l)ps命令用于观察正在运行的进程的情况ps命令包括较丰富的可选参数,常见的可选参数包括如下几个-A显示所有用户启动的进程-a显示所有其他用户的进程-u显示进程拥有者、进程启动时间等更详细的信息-x显示不是由终端提供的进程信息-r只显示正在运行的进程_ni显示线程信息-w宽行显示进程信息-1用长格式显示进程信息-t只显示由终端/dev/tty提交的进程
(2)执行ps命令操作ps命令可以显示本机正在运行的所有进程(包括其他用户和系统运行的进程)的详细列表命令格式ps-aux根据命令的执行结果,分析各进程的运行情况003rootg MVM:-root
24480.
00.2212884600S12:410:00/usr/lib/ubuntu*root
24540.
00.2628204872SI12:410:00/usr/lib/indica*lp
24670.
00.062081380S12:410:00/usr/lib/cups/n*root
24750.
00.58610812100SI12:410:00/usr/bin/pythonroot
24760.
00.3766447392SI12:410:00/usr/lib/unity-root
24770.
00.2840805520SI12:410:00/usr/lib/unity-*root
24780.
00.4891129380SI12:410:00/usr/lib/unity-root
25050.
00.1420243476SI12:410:00/usr/bin/zeitgeroot
25120.
00.2502004600SI12:410:00/usr/lib/zeitge*root
25130.
00.2533565188SI12:410:00zeitgeist-datah*root
25190.
00.04208280*s12:410:00/bin/catroot
25460.
00.69798013612SI12:410:00/usr/bin/pythonroot
25470.
00.1744723736SI12:410:00/usr/lib/unity-root
25760.
00.4423728636SI12:410:00/usr/lib/gnome-*root
25800.
00.4733169520SI12:410:00telepathy-indicroot
25860.
00.3421846252SI12:410:00/usr/lib/teleparoot
25910.
00.4913329268SI12:410:00/usr/lib/gnome-*root
25970.
00.4410569172SI12:410:00gnome-screensav•root
26080.
00.78889614788SI12:410:00gnome-terminalroot
26120.
00.02384724s12:410:00gnome-pty-helperoot
26130.
00.056321940pts/0Ss12:410:00bashroot
26500.
00.1356964076SI12:430:00/usr/lib/deja-aroot
28350.
00.049281156pts/0R+13:250:00ps-auxrootdMVM:-#B2进程创建1编写一段程序,使用系统调用fork创建两个子进程当此程序运行时,在系统中有一个父进程和两个子进程活动让每一个进程在屏幕上显示一个字符父进程显示father;子进程分别显示字符串child One”和字符串“child Twoo试观察记录屏幕上的显示结果,并分析原因❽0@root@MVM:/mailong/testc/exp5/part2root@MVM:/mailong/testc/exp5/part2#Is makefileprocess.croot^MVM:/mailonq/testc/exp5/part2#|make gcc-o processprocess.croot@MVM:/mailong/testc/exp5/part2#Is旭kefile[procesW]wo^esstcroot@MVM:/mailong/€SS^D5/pa rt2#|执行之后的结果如下:二rootOMV:/mailonci/testc/exp5/Dart2M/proceQ fatherroot@MVM:/mallong/testc/exp5/part2#child twochild one./process jfather|两个输出结果不一样,是因为他们启动的顺序是没有先后的,都是平等的代码如下#includestdio.h#includeunistd.hint mainintargc,char*argv[]int pid=0;pid=fork;//Great processif failed-1==pid,root0MVM:/mailonq/testc/exD5/Dart2#childonehildtwo|return0;//in parentsprocesspidchildonepid二二ifpid!=0pid=fork;if-1pid二二printf/zCreat secondprocessfailed!\n\n7;return0;//in parentsprocesspidchild twopid二二ifpid!=0printf,zfather\n\n/z;//in childtwo processpid0二二elseprintf,zchild two\n\n〃;//in childone processpid==0elseprintf/zchild one\n\n〃;return03利用fork创建子进程编写一个程序它利用(地建一个子进程;父进程打开一个文件,父子进程都向文件中fork J写入信息(利用)表明是在哪个进程中;每个进程都打印两个进程的号最后父进程whte,ID执行wait()o。
个人认证
优秀文档
获得点赞 0