进程控制和守护进程的创建Word文档下载推荐.docx
《进程控制和守护进程的创建Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《进程控制和守护进程的创建Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
一、实验目标:
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<
stdio.h>
stdlib.h>
unistd.h>
sys/types.h>
sys/wait.h>
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<
n;
i++){
p1=fork();
if(p1>
0){//父进程
printf("
ProcessId:
%d,ParentId:
%d,ChildId:
%d\n"
getpid(),getppid(),p1);
break;
}
elseif(p1<
0){//fork错误
forkerror!
\n"
);
if(i==n){//最后一个子进程
printf("
%d,Child0\n"
getpid(),getppid());
if(p1>
0)
waitpid(p1,NULL,0);
return0;
}
2.编例实现创建n个子进程P1,P2,…,Pn,其中,各进程之间的关系是:
P1,…,Pn都是调用进程的子进程。
intmain(intargc,char*argv[]){
if(argc!
=2){//错误输出
Usage:
%sprocesses\n"
return1;
n=atoi(argv[1]);
//参数转换成整数
pid_tp1arr[n];
if(p1<
=0)break;
//子进程或者fork错误
else
p1arr[i]=p1;
//保存父进程的子进程的进程号
if(p1<
0){
forkerror\n"
exit(-1);
elseif(p1==0)//子进程
%d\n"
else
0)
for(i=0;
i++)waitpid(p1arr[i],NULL,0);
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打印出来。
要求:
(2)d通过命令行参数传入;
(30分)
图1.n=23-2=6
如:
$./a.out1
$./a.out2
$./a.out3
提示,本题有一定的难度,参考流程见下图:
pid_tp1,p2;
intnum=1,n,i;
Iamprocessno:
%2d;
WithPID:
%5d;
PPID:
%5d.\n"
num,getpid(),getppid());
switch(p1=fork()){
case0:
num*=2;
case-1:
forkerror"
exit(-1);
default:
switch(p2=fork()){
case0:
num=num*2+1;
break;
case-1:
printf("
exit(-1);
default:
waitpid(p1,NULL,0);
waitpid(p2,NULL,0);
exit
(1);
}
}
4.请根据课件描述的守护进程创建步骤编程实现对守护进程的创建,参照下面的实现,如果有兴趣,可以自己添加个性化功能(自行发挥,如写文件。
。
等)。
请附上源代码及运行结果。
运行及测试方法如下:
$./a.out
$ps–axj|grepa.out
1271092710927109?
-1Ss5000:
00./a.out
……grepa.out
参考实现:
(不一定完全正确,请调试)
sys/stat.h>
fcntl.h>
intdaemon(intnochdir,intnoclose){
pid_tpid;
pid=fork();
if(pid<
0){//进程创建失败
perror("
return-1;
if(pid!
=0)exit(0);
//创建守护进程第一步,父进程退出,子进程孤儿
pid=setsid();
//第二步,调用setsid,使得该进程成为领头进程
if(pid==-1){//调用失败
setsiderror"
if(!
nochdir){//第三步,更改工作目录到“/”
chdir("
/"
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);
//第五步,设置守护进程的文件创建掩码
intmain(void){
daemon(0,0);
sleep(1000);
/*
*******************************************************************
●完成以上过程并取得正确结果:
90分
●以下为帮助各位在帮同学找错的过程中进一步理解进程控制
********************************************************************
*/
附加题:
针对以上题号相应题目,以下程序都有错,你知道错在哪里吗?
请指出出错的地方并说明原因。
(10分)
第1题:
第2题:
第4题:
错误测试一:
错误测试二:
四、实验结果
五、实验总结与体会
指导教师批阅意见:
成绩评定:
指导教师签字:
年月日
备注: