进程控制和守护进程的创建_第1页
进程控制和守护进程的创建_第2页
进程控制和守护进程的创建_第3页
进程控制和守护进程的创建_第4页
进程控制和守护进程的创建_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、深圳大学实验报告课程名称:linux系统编程实验项目名称学院专业:软件工程指导教师:报告人学号:2011150026 班级:一班实验时间:201424实验报告提交时间:2014/4/26教务处制一、实验目标:1. 掌握fork()系统调用及进程的相关概念2. 掌握wait()和waitpid()系统调用3. 掌握进程组,会话进程等概念和setsid()系统调用4. 掌握文件重定向的技巧5. 掌握创建守护进程的步骤及其实现二、实验环境与工件1. 湖边linux实验室2. fedora 13三、实验内容与步骤下面的程序会用到如下程序段:从命令行获取数字参数,参考实现见下图:nt naln(lnt

2、argc. char »argv ) id_t childpid 0;nt 1tn;(argc !2) fprintf(stderr t nusage : %s processes n"targv 0);匚门匚ui; 1;n«atoi(argv 1);1.编例实现创建n个子进程pl, p2,,pn,其中,各进程之间的关系是:p1 是调用进程的子进程,p(k+1)是pk的子进程。请打印各进程本身的进程号、 父进程号,子进程号。参考运行结果如下。要求:(1)每个父进程都要等待linuxyzhlocalhost $ gcc exi.c - o exilinuxyzhlo

3、calhost$ . /exi3 1:1processid:3227,parentid::3068childid::3228 1:2processid:3228.parentid::3227,childid::3229 1:3processid:3229.parentid::3228,childid::0linuxyzhlocalhost$ ./exi6i:1processid:3230.parentid:3068childid:3231i:2processid:3231,parentid:3230,childid:3232i:3processid:3232.parentid:3231,chi

4、ldid:3233i:4processid:3233,parentid:3232,childid:3234i:5processid:3234.parentid:3233,childid:3235i:6processid:3235,parentid:3234,childid:0子进程退出后才能退出;(2) n通过命令行参数传入;(3)附上源代码截图 和运行结果截图。(20分) linuxyzh蓟ocalhost $ #include <stdio.h>#include <stdlib.h>#include <unistd.h>#inelude <sys/

5、types.h>#include <sys/wait.h>int main(int argc ,char *argv)pid_tpl;int i,n;if(argc!=2)程序名为1,参数为2fprintf(stderr,"usage:%s processes xn'argvfo);return 1;in=atoi(argv 1);/参数转化为整数for(i=0;i<n;i+)pl=fork();if(pl>0)/ 父进程printf("process id:%d,parent id:%d,child id:%dn",getp

6、id(),getppid(),p 1); break;1else if(pl<0)/fork 错误printf("fork error!n");iif(i=n)/最后一个子进程printf("process id:%d,parent id:%d,child 0n”,ge中id(),getppid();if(pl>0)waitpid(pl,null,o);return 0;2.编例实现创建n个子进程pl, p2,,pn,其中,各进程之间的关系是: p1,pn都是调用进程的子进程。请打印各进程本身的进程号、父进程号, 子进程号。参考运行结果如下。要求:(1

7、)每个父进程都要等待子进程退出 后才能退出;(2) n通过命令行参数传入;(3)附上源代码截图和运行结果 截图。(20分)linuxyzhlocalhost $ gcc ex2. c o ex2linuxyzhlocalhost $ /ex2 41:4processid5453parentid:5449childid: 01:3processid:5452parentid:5449childid:01:2processid5451parentid:5449childid:01:1processid:5450parentid:5449childid: 01:0processid5449child

8、ren ids: 5450 5451 !5452 5453linuxyzhlocalhost $ ./ex2 6i:4processid5458parentid:5454childid:0i:5processid:5459parentid:5454childid:0i:3processid5457parentid:5454childid0i:6processid:5460parentid:5454childid:0i:2processid5456parentid:5454childid0i:1processid:5455parentid:5454childid:0i: o process id

9、: 5454 children ids: 5455 5456 5457 5458 5459 5460 linuxyzhlocaihost -$ |#include <stdio.h>#include <stdlib.h>#include <unistd.h> #include <sys/types.h> #include <sys/wait-h> int main(int argc,char *argv)pid.tpl;int i,n;if(argc!=2)/ 错误输出fprintf(stderr,husage :%s process

10、esnn,argv0);return 1;n = atoi(argvl 1 );/参数转换成整数pid_t plarrn;for(i=0;i<n;i+)pl=fork();if(pl<=0) break;/子进程或者fork错误elseplarri=pl;/保存父进程的子进程的进程号if(pl<0)printf(mfork errorn");exit(-l);else if(pl=o)子进程printf("process id:%d,parent id:%d,child id:%dn ”,getpid(),getppid(),pl); elseprint#

11、"process id:%d,parent id:%d,child ld:%dn m,getpid(),getppid(),p 1);if(pl>0)for(i=0;i<n;i+) waitpid(p 1 arri,null,o);return 0;3.编例实现创建n=2d-2个子进程pl, p2,,pn,其中,d是树的深度且d>=l, pl和p2是调用进程的子进程,p3和p4是p1的子进程,p5和p6是p2的 子进程。也就是各进程之间的关系是:pi是p2i+1和p2i+2的父进程,也是 组成二叉树的关系,如下图所示。对于不是叶子的进程,将其id和父进程 id打印出

12、来。参考运行结果如下。要求:(1)每个父进程都要等待子进程 退出后才能退出;(2) d通过命令行参数传入;(3)附上源代码截图和运行 结果截图。(30分)图 1. n=23-2=6如:$./a.out 1ianprocessno1withpid4147andppid3420$./a.out 2iamprocessno1withpid4150andppid3420iamprocessno2withpid4151andppid4150iamprocessno3withpid4152andppid4150$./a.out 3iamprocessno1withpid4158andppid3420iam

13、processno2withpid4159andppid4158iamprocessno3withpid4160andppid4158iamprocessno4withpid4161andppid4159iamprocessno6withpid4162andppid4160iamprocessno5withpid4167andppid4159iamprocessno7withpid4168andppid4160提示,本题有一定的难度,参考流程见下图:f c>r ( 1 =0 ; 1 v depth ;!. + *)print!(hi am process no %5d with pid

14、%5d and ppid %dnh , numb, gexpid()f getppid();switch (pidl = fork()<case 0:numb =2 numb ; br<?ak ;case -1 :perror ( fork n ; exit (1): default :switch < pid2 =f ork () ) -case 0:numb =2»numb t ; breas :case 1.:perror ( n f ork ' ) ; ex 11 (1);def ault :#include <stdio.h>#incl

15、ude <stdlib.h>#include vunistd.h>#include <sys/types.h>#include <sys/wait.h>int main(int argcchar *argv) pid_tpl,p2;int num=l,n4; if(argc!=2)/ 错误输出 fprintf(stderr,"usage :%s processesn'*,argv0); return 1;n= atoi(argvl);/参数转换成整数for(i=0;i<n;i+)printf(hi am process no :

16、%2d; with pid:%5d; ppid:%5d.nu,num,getpid(),getppid(); switch(pl=fork()case 0:num*=2;break;case -1:printfc'fork error*1);exit(-l);default:switch(p2=fork() case 0:num=num*2+l;break;case -1:printf(mfork error'1);exit(-l);default:waitpid(p 1 ,null,0);waitpid(p2,null,0);exit(l);return 0;4.请根据课件描

17、述的守护进程创建步骤编程实现对守护进程的创建,参照下面的 实现,如果有兴趣,可以自己添加个性化功能(自行发挥,如写文件。等)。 请附上源代码及运行结果。(20分)运行及测试方法如下:$./a.out$ps - axj | grep a.out1 27109 27109 27109 ? -1 ss 500 0:00 ./a.outgrep a.out参考实现:(不一定完全正确,请调试)include <stdio.h>#include <unistd.h>include <sys/types.h>include <sys/stat.h>#indud

18、e <fcntl.h>intdaemon (int noctidir, int noctose)pw_t papd = fork ();f如果创it进用恢畋*/if (pid < 0)<perror (“fork”);return -1;/父/if (pid != 0)exit (0);广成为会话领头进程”p»d = setsld();if (pid < -1)perror ("setskf);return -1;/ wtfl 录修凹饭根fl录*/if (! nochdir)didlr cf);厂将怎准需入惟血览定向到空设备吟if (! nod

19、ose)<int fd;fd = open (7dev/nuirr o rdwr. 0);if (fd f= -1)<dup2 (fd, std1n.fileno);dup2 (fd, stdoutfileno);dup2 (fd, stderr.f1leno);if (fd > 2)close (fd);umask (0027);return 0;int main(wid)ddemon(0r0);sleep(1000);return 0;#include <stdio.h>#include <stdlib.h>#include <unistd.

20、h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int daemon (int nochdirjnt noclose) pid_t pid;pid=fork();if(pid<0)/进程创建失败perrorcfork errorm);return -1;if(pid!=o) exit(o); 创建守护进程第一步,父进程退出,子进程孤儿 pid=setsid();第二步,调用setsid,使得该进程成为领头进程if(pid=-l)调用失败perrorc'setsi

21、d error");return -1;if(!nochdir)第三步,更改工作目录到“/”chdir(vh);if(!noclose)第四步,关闭文件描述符,并重定向标准输入、输出、错误int fd;fd=open(vdev/nuiro_rdwr,0);if(fd!=l)dup2(fd,stdin_fileno); dup2(fd,stdout_fileno);dup2(fd,stderr_f!leno);if(fd>2) close(fd);umask(0027); 第五步,设置守护进程的文件创建掩码return 0;1int main(void)daemon(0,0);s

22、leep(looo);return 0;<t> <f> <f> <f> <f> <t> <f> <t> <t> <t> <t> <t> <t> <t> <t> <f> <f> <t> <t> <f> <f> <t> <t> <t> <t> <t> <f> <t>

23、<f> <t> <f> <f> <t> <t> <f> <t> <t> <t> <t> <f> <f> <t> <f> <t> <t> <f> <t> <t> <f> <t> <f> <f> <t> <f> <2 rj> rj> rj> rj> rj>

24、 rj、rj> r|> rj> rj> r|> rj> rj> rj> rj> rj、rj> rj> rj、rj> rj> rj> r|> rj> rj> r|> rj> rj> rj> rj rj> rjw rj> r|> rj> rj> rj、rj、rj> rj、rj> rj> rj、rj> rj、rj> rj> rj、rj> rj、rj> rj、rj> rj、rj> rj&g

25、t; rjw rj> rjw rj> rj> rj>完成以上过程并取得正确结果:90分以下为帮助各位在帮同学找错的过程中进一步理解进程控制彷“口% 彷弘弘弘弘彷弘彷弘% 弘口* rtwrtw rtw* *rt«* *rjw */附加题:针对以上题号相应题目,以下程序都有错,你知道错在哪里吗?请指出出错的地方并说明原因。(10分)第1题:activitiesmoa 1933warn w«4print f(: f x(ml;acfivitietmm 133c y tab width 8 vinsgm w«4“ edit vltwtoo<&

26、gt; oocum«n<s m«pd op«n v afinclude <4tdi>.h> finclude ««tdlib.h> firn lode «mktd.h>lnt mint lnt orgc tchar eargv( |)lf(arqc'-)fprintf(stderrr s return :n-«tol(«rgv( j);for(i- ;y)pldaformo; ir(pi(k)pxror(<orelse if(pld> )一 wvi .1.9&

27、#171;tpld()sippid()md):l.c (/dkt)fmt edit view march tools docurntnts h«pfor(l-if (a-1)if(pid)fprintf(«tdtrr,二rc:“5“5 ¥【):return ;dtoi(argw(】);pld«for*(); lf(pld< )perror( f八 fai j.n );else if (pid» )print f( 1»%1 !' %d brek;prlntf( i-5kl i n %d mywaltpld(pldtmil< i # ):father is %di %dn .i.o«tpia()<o«tppid()fpid):. ildn-9n99otpld() .etppldo);c y tjb width 8 vln 18. col 1inswgm丄丄29(none) desktop$ ./i 41=1 if 2728.1=2 pm 2729.1=3m 2730.1=4m 2

温馨提示

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

评论

0/150

提交评论