《使用fork创建进程.docx》由会员分享,可在线阅读,更多相关《使用fork创建进程.docx(16页珍藏版)》请在优知文库上搜索。
1、使用fork创建进程L实验目的(1)理解LinUX实现系统调用的机制;(2)理解并掌握fork系统调用创建新进程的过程和原理;(3)掌握Vi(vim)、GCC和GDB的使用。2 .实验内容(1)通过编程验证fork函数的实现机制,并理解写时拷贝COW的意义;(2)使用fork和exec函数创建新进程。3 .实验方法(实验步骤)实验二步骤:第一步:双击打开进入IinUX的终端,用Vi新建一个Del_Sleep.C的文件第二步:创建成功之后,输入“a”或o”或i”进行插入编辑写入模式第三步:开始写我们的代码第四步:代码编辑完成之后,按“Esc”间退出编辑模式第五步:输入“:wq”对我们刚才编辑的代
2、码进行保存退出第六步:输入“gccDel_Sleep.c-oDel_Sleep”命令运行代码的编译成可执行文件第七步:然后输入“./a.out”或者./Del_Sleep进行代码的运行,得到我们程序的运行结果实验三步骤:第一步:双击打开进入IinUX的终端,用Vi新建一个Three_Fork.c的文件第二步:创建成功之后,输入“a”或o”或i”进行插入编辑写入模式第三步:开始写我们的代码第四步:代码编辑完成之后,按“Esc”间退出编辑模式第五步:输入“:wq”对我们刚才编辑的代码进行保存退出第六步:输入“gccThree_Fork.c-oThree_Fork,命令运行代码的编译成可执行文件第七
3、步:然后输入“/a.out”或者”./Three_Fork进行代码的运行,这时候就可以得到我们程序的结果实验四步骤:第一步:双击打开进入IirIUX的终端,用Vi新建一个two_before.c的文件第二步:创建成功之后,输入“a”或o”或i”进行插入编辑写入模式第三步:开始写我们的代码第四步:代码编辑完成之后,按“Esc”间退出编辑模式第五步:输入“:wq”对我们刚才编辑的代码进行保存退出第六步:输入“gcctwobefore.c-Otwo_before”命令运行代码的编译成可执行文件第七步:然后输入“./two_beforeou.tst进行代码的运行,第八步:继续输入catou.tst这时
4、候就可以查看我们程序的结果4 .实验过程(源代码、配置清单必须带注释)注释:源码中出现的定义Pid为进程号,PPid为父进程号,getppid为获取父进程id,getpid为获取子进程id,SleeP为睡眠时钟,fork函数为一次调用,返回两个值,子进程返回0,父进程返回子进程id标记,出错返回-1,exec函数把程序(保存在磁盘某个目录中的可执行文件)读入内存并执行,Exec函数不创建进程,而是用一个新的程序替换当前进程的代码段、数据段和堆栈。execve(,7binlszz,arg,NULL)为使用exec函数执行一个新的程序(binls)char*arg3=,7binls,-,NULL)
5、为定义一个字符串数组,最后一个数组元素为null1使用GCC调试C程序(预处理、编译、汇编、链接)预处理:对xx.c中的预处理命令进行处理,生成一个中间文件XX.iOrootubuntu:Rou文件(F)编辑(E)查看(V)线端(T)帮助(H)rootubuntu:#cdRourootubuntu:/Rou#IsThreeFork.*ThreeFork.crootubuntu:*/Rou#gccThreeFork.c-oThreeFork.iroottaubuntu:-/Rou#IsThreeFork.*ThreeFork.cThreeFork.iroot(Qubuntu:-/Rou#编译:对
6、中间文件xxi进行编译,生成ASCn的汇编语言文件XX.Srootubuntu:Rou文件(F)Si(E)Sfi(V)a(T)帮助(H)IrOOtiIbUntu:#cdRourootubuntu:/Rou#ISThreeFork.*IThreeFork.cThree_Fork.irootubuntu:/Rou#gccThreeFork.c-oThreeFork.srootubuntu:/Rou#LSThreeFork.*I程序“LS”尚未安装。您可以便用以下命令安装:apt-getinstallSlrootubuntu:-/Rou#IsThreeFork.*IThreeFork.cThree_
7、Fork.iThree_Fork.srootubuntu:/Rou#汇编:把汇编文件XX.S转换成可重定位的目标文件XX.OCQrootubuntu:-ZRou文件(F)媚辑(E)查看(V)帮助(H)rootubuntu:-#cdRouroottaubuntu:-/Rou#IsThreeFork.*ThreeFork.cThree_Fork.iThree_Fork.sroot(aubuntu:-/Rou#gccThreeFork.c-oThreeFork.oroot(aubuntu:-/Rou#IsThreeFork.*ThreeFork.cThreeFork.iThree_Fork.oThr
8、ee_Fork.srootubuntu:-/Rou#链接:把若干个可重定位的目标文件以及共享的库文件汇集成一个可执行的目标文件.root(g)ubuntu:Rou文件(F)编辑(E)Sfi(V)终端(T)帮助(H)rootubuntu:#cdRourootubuntu:-/Rou#IsThreeFork.*ThreeFork.cThreeFork.iThreeFork.oThreeFork.sroot(3ubuntu:-/Rou#gccThreeFork.c-oThreeForkrootubuntu:-/Rou#./ThreeForkbeforeforkingThisischildproces
9、s.pid=6946,ppid=6945Thisischildprocess.pid=6947fppid=6946Thisischildprocess.pid=6948,ppid=6947使用GDB调试C程序(quit退出调试)OCQroot(gubuntu:-/Rou文件(F)编辑(E)查看(V)终端Cr)用助(H)rootubuntu:-#cdRourootubuntu:-/Rou#gcc-gThreeFork.c-oThreeForkrootQubuntu:/Rou#gdb-qThreeForkReadingsymbolsfromrootRouThreeFork.done.(gdb)2E
10、xec函数的使用题1:使用exec函数执行一个新的程序(binls)源码0rootubuntu:-/Rou文由F)Htt(E)S(V)HiS(T)帮助(川#include-#include-#include*inmain(intargctchar*argv)pidtpid;int-i=;,getpid(),getppid(););char*arg=,printf(pid=fork();if(pid)(printf()elseif(pid=)printf(if(execve(printf(exit();elsesleep();printf(dn,getpid();)return;)0Qrootu
11、buntu:*Rou文件(F)SItt(E)fifi(V)tta)帮助(H)rootubuntu:/Rou#gccforkexec.crootubuntu:/Rou#./a.outiBeforeforking.Thisischildprocess.pid=6653,ppid=6652total96-rwxrw-rw-1rootroot1129Oct1322:042.c叩-rw-r-r-1rootroot761Oct1322:144.ci-rw-r-r-1rootroot805Oct1322:2944.c-rw-r-r-1rootroot2109Oct1322:3355.c-rwxr-xr-x1
12、rootroot4845Oct1401:44DelSleep-rwr-r-1rootroot395Oct1323:31DelSleep.c-rwr-r-1rootroot447Sep2900:01ExecTree.c-rwxr-xr-x1rootroot4955Oct1323:39ForkThree-rw-r-r-1rootroot439Oct1323:38FOrklThree.c-rw-r-r-1rootroot416Sep2900:17ForkThreeDeisleep.c-rw-r-r-1rootroot924Oct1401:37ThreeFork.c-nxrv-n-1rootroot8
13、85Oct1418:15ThreeforkTree.c-rwxr-xr-x1rootroot524Oct1418:55a.out-rwxrw-rw-1rootroot579Oct1418:55fork_exec.c-rw-r-r-1rootroot149Oct1401:40ou.tst-rw-r-r-1rootroot379Octl20:41pstreetest.c-rw-r-r-1rootroot91Octl21:36tree.cfrc,_1-cc+IUAGCi14crr+-一-3Fork函数的使用题2:去掉sleep源码Orootubuntu:*Rou文件(F)ttWE)fifl(V)终翻
14、T)WSI(H)Itincludemain(ntargc,char*argv)(pidtpid;printf(pid=fork();if(pid)();printf()elseif(pid=);printf()else,getpid(),getppid();printf()return;),getpid();Grootubuntu:*Rou文件(F)煽Ifl(E)杳看(V)终造(T)帮助(H)rootubuntu:#cdRourootubuntu:/Rou#gccDelSleep.c-oDelSleeproot(aubuntu:/Rou#./DelSleepbeforeforkingThisisparentprocess.pid=6631root0ubuntu:/Rou#Thisischildprocess.pid=6632,ppid=1题3:fork的三次调用源码rootubuntu:-/Rou文件(F)a(E)fi(v)()常助(H)ficludesincludewincludeintmain(intargc,char*argv)pidtpid;printf(.);p