进程控制和守护进程的创建.docx
- 文档编号:7027587
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:13
- 大小:696.61KB
进程控制和守护进程的创建.docx
《进程控制和守护进程的创建.docx》由会员分享,可在线阅读,更多相关《进程控制和守护进程的创建.docx(13页珍藏版)》请在冰豆网上搜索。
进程控制和守护进程的创建
深圳大学实验报告
课程名称:
Linux系统编程
实验项目名称:
进程控制和守护进程的创建
学院:
计算机与软件学院
专业:
软件工程
指导教师:
冯禹洪
报告人:
林庆遂学号:
2011150026班级:
一班
实验时间:
2014/3/24
实验报告提交时间:
2014/4/26
教务处制
一、实验目标:
1.掌握fork()系统调用及进程的相关概念
2.掌握wait()和waitpid()系统调用
3.掌握进程组,会话进程等概念和setsid()系统调用
4.掌握文件重定向的技巧
5.掌握创建守护进程的步骤及其实现
二、实验环境与工件
1.湖边Linux实验室
2.Fedora13
三、实验内容与步骤
下面的程序会用到如下程序段:
从命令行获取数字参数,参考实现见下图:
1.编例实现创建n个子进程P1,P2,…,Pn,其中,各进程之间的关系是:
P1是调用进程的子进程,P(k+1)是Pk的子进程。
请打印各进程本身的进程号、父进程号,子进程号。
参考运行结果如下。
要求:
(1)每个父进程都要等待子进程退出后才能退出;
(2)n通过命令行参数传入;(3)附上源代码截图和运行结果截图。
(20分)
#include
#include
#include
#include
#include
intmain(intargc,char*argv[]){
pid_tp1;
inti,n;
if(argc!
=2){//程序名为1,参数为2
fprintf(stderr,"Usage:
%sprocesses\n",argv[0]);
return1;
}
n=atoi(argv[1]);//参数转化为整数
for(i=0;i p1=fork(); if(p1>0){//父进程 printf("ProcessId: %d,ParentId: %d,ChildId: %d\n",getpid(),getppid(),p1); break; } elseif(p1<0){//fork错误 printf("forkerror! \n"); } } if(i==n){//最后一个子进程 printf("ProcessId: %d,ParentId: %d,Child0\n",getpid(),getppid()); } if(p1>0) waitpid(p1,NULL,0); return0; } 2.编例实现创建n个子进程P1,P2,…,Pn,其中,各进程之间的关系是: P1,…,Pn都是调用进程的子进程。 请打印各进程本身的进程号、父进程号,子进程号。 参考运行结果如下。 要求: (1)每个父进程都要等待子进程退出后才能退出; (2)n通过命令行参数传入;(3)附上源代码截图和运行结果截图。 (20分) #include #include #include #include #include intmain(intargc,char*argv[]){ pid_tp1; inti,n; if(argc! =2){//错误输出 fprintf(stderr,"Usage: %sprocesses\n",argv[0]); return1; } n=atoi(argv[1]);//参数转换成整数 pid_tp1arr[n]; for(i=0;i p1=fork(); if(p1<=0)break;//子进程或者fork错误 else p1arr[i]=p1;//保存父进程的子进程的进程号 } if(p1<0){ printf("forkerror\n"); exit(-1); } elseif(p1==0)//子进程 printf("ProcessId: %d,ParentId: %d,ChildId: %d\n",getpid(),getppid(),p1); else printf("ProcessId: %d,ParentId: %d,ChildId: %d\n",getpid(),getppid(),p1); if(p1>0) for(i=0;i return0; } 3.编例实现创建n=2d-2个子进程P1,P2,…,Pn,其中,d是树的深度且d>=1,P1和P2是调用进程的子进程,P3和P4是P1的子进程,P5和P6是P2的子进程。 也就是各进程之间的关系是: Pi是P2i+1和P2i+2的父进程,也是组成二叉树的关系,如下图所示。 对于不是叶子的进程,将其ID和父进程ID打印出来。 参考运行结果如下。 要求: (1)每个父进程都要等待子进程退出后才能退出; (2)d通过命令行参数传入;(3)附上源代码截图和运行结果截图。 (30分) 图1.n=23-2=6 如: $./a.out1 $./a.out2 $./a.out3 提示,本题有一定的难度,参考流程见下图: #include #include #include #include #include intmain(intargc,char*argv[]){ pid_tp1,p2; intnum=1,n,i; if(argc! =2){//错误输出 fprintf(stderr,"Usage: %sprocesses\n",argv[0]); return1; } n=atoi(argv[1]);//参数转换成整数 for(i=0;i printf("Iamprocessno: %2d;WithPID: %5d;PPID: %5d.\n",num,getpid(),getppid()); switch(p1=fork()){ case0: num*=2; break; case-1: printf("forkerror"); exit(-1); default: switch(p2=fork()){ case0: num=num*2+1; break; case-1: printf("forkerror"); exit(-1); default: waitpid(p1,NULL,0); waitpid(p2,NULL,0); exit (1); } } } return0; } 4.请根据课件描述的守护进程创建步骤编程实现对守护进程的创建,参照下面的实现,如果有兴趣,可以自己添加个性化功能(自行发挥,如写文件。 。 。 等)。 请附上源代码及运行结果。 (20分) 运行及测试方法如下: $./a.out $ps–axj|grepa.out 1271092710927109? -1Ss5000: 00./a.out ……grepa.out 参考实现: (不一定完全正确,请调试) #include #include #include #include #include #include intdaemon(intnochdir,intnoclose){ pid_tpid; pid=fork(); if(pid<0){//进程创建失败 perror("forkerror"); return-1; } if(pid! =0)exit(0);//创建守护进程第一步,父进程退出,子进程孤儿 pid=setsid();//第二步,调用setsid,使得该进程成为领头进程 if(pid==-1){//调用失败 perror("setsiderror"); return-1; } if(! nochdir){//第三步,更改工作目录到“/” chdir("/"); } if(! noclose){//第四步,关闭文件描述符,并重定向标准输入、输出、错误 intfd; fd=open("/dev/null",O_RDWR,0); if(fd! =1){ dup2(fd,STDIN_FILENO); dup2(fd,STDOUT_FILENO); dup2(fd,STDERR_FILENO); if(fd>2)close(fd); } } umask(0027);//第五步,设置守护进程的文件创建掩码 return0; } intmain(void){ daemon(0,0); sleep(1000); return0; } /* ******************************************************************* ●完成以上过程并取得正确结果: 90分 ●以下为帮助各位在帮同学找错的过程中进一步理解进程控制 ******************************************************************** */ 附加题: 针对以上题号相应题目,以下程序都有错,你知道错在哪里吗? 请指出出错的地方并说明原因。 (10分) 第1题: 第2题: 第4题: 错误测试一: 错误测试二: 四、实验结果 五、实验总结与体会 指导教师批阅意见: 成绩评定: 指导教师签字: 年月日 备注:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 控制 守护 创建