进程控制和守护进程的创建Word文档下载推荐.docx

上传人:b****5 文档编号:20051691 上传时间:2023-01-16 格式:DOCX 页数:13 大小:696.61KB
下载 相关 举报
进程控制和守护进程的创建Word文档下载推荐.docx_第1页
第1页 / 共13页
进程控制和守护进程的创建Word文档下载推荐.docx_第2页
第2页 / 共13页
进程控制和守护进程的创建Word文档下载推荐.docx_第3页
第3页 / 共13页
进程控制和守护进程的创建Word文档下载推荐.docx_第4页
第4页 / 共13页
进程控制和守护进程的创建Word文档下载推荐.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

进程控制和守护进程的创建Word文档下载推荐.docx

《进程控制和守护进程的创建Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《进程控制和守护进程的创建Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。

进程控制和守护进程的创建Word文档下载推荐.docx

一、实验目标:

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题:

错误测试一:

错误测试二:

四、实验结果

五、实验总结与体会

指导教师批阅意见:

成绩评定:

指导教师签字:

年月日

备注:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 工作计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1