进程管理实验文档格式.docx

上传人:b****2 文档编号:15163930 上传时间:2022-10-28 格式:DOCX 页数:22 大小:114.19KB
下载 相关 举报
进程管理实验文档格式.docx_第1页
第1页 / 共22页
进程管理实验文档格式.docx_第2页
第2页 / 共22页
进程管理实验文档格式.docx_第3页
第3页 / 共22页
进程管理实验文档格式.docx_第4页
第4页 / 共22页
进程管理实验文档格式.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

进程管理实验文档格式.docx

《进程管理实验文档格式.docx》由会员分享,可在线阅读,更多相关《进程管理实验文档格式.docx(22页珍藏版)》请在冰豆网上搜索。

进程管理实验文档格式.docx

a'

,子进程分别显示字符'

b'

和字符'

c'

试观察记录屏幕上的显示结果,并分析原因。

2、修改上述程序,每一个进程循环显示一句话。

子进程显示'

daughter…'

及'

son……'

,父进程显示'

parent……'

,观察结果,分析原因。

3、用fork()创建一个进程,再调用exec()用新的程序替换该子进程的内容,利用wait()来控制进程执行顺序。

4、修改实验代码2中的程序,用lockf()来给每一个进程加锁,以实现进程之间的互斥,观察并分析出现的现象。

5、写一个使用守护进程(daemon)的程序,来实现:

(1)创建一个日志文件/var/log/Mydaemon.log

(2)每5秒都向其中写入一个时间戳(使用time_t的格式)注意:

要root权限才能在/var/log创建文件。

6、

(1)编写程序:

用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按^c键);

捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,

子进程捕捉到信号后分别输出下列信息后终止:

Childprocess1iskilledbyparent!

Childprocess2iskilledbyparent!

父进程等待两个子进程终止后,输出如下的信息后终止:

Parentprocessiskilled!

(2)分析利用软中断通信实现进程同步的机理

7、编写程序实现进程的管道通信。

用系统调用pipe()建立一管道,二个子进程P1和P2分别向管道各写一句话:

Child1issendingamessage!

Child2issendingamessage!

父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,后P2)。

8、消息的创建、发送和接收。

使用系统调用msgget(),msgsnd(),msgrev(),及msgctl()编制一长度为1k的消息发送和接收的程序。

9、编制一长度为1k的共享存储区发送和接收的程序。

三、实验原理

 

1、进程创建

2、进程控制

3、信号量机制

4、管道机制

5、消息通信机制及共享存储区机制。

四、实验设备

Win7下虚拟机VMware-workstation-11.0.0及CentOS-5.8-i386

五、实验要求

调试并运行一个允许n 

个进程并发运行的进程管理模拟系统。

了解该系统的进程控制、同步及通讯机构,每个进程如何用一个 

PCB 

表示、其内容的设置;

各进程间的同步关系;

系统在运行过程中显示各进程的状态和有关参数变化情况的意义。

六、实验程序

1、进程创建

#include<

stdio.h>

main()

{

intp1,p2;

while((p1=fork())==-1);

/*创建子进程p1*/

if(p1==0)putchar('

);

else

{

while((p2=fork())==-1);

/*创建子进程p2*/

if(p2==0)putchar('

elseputchar('

}

2、进程管理

intp1,p2,i;

while((p1=fork())==-1);

if(p1==0)

for(i=0;

i<

10;

i++)

printf("

daughter%d\n"

i);

else

while((p2=fork())==-1);

if(p2==0)

printf("

son%d\n"

parent%d\n"

3、进程控制

#include<

unistd.h>

main()

intpid;

pid=fork();

/*创建子进程*/

switch(pid)

case-1:

/*创建失败*/

forkfail!

\n"

exit

(1);

case0:

/*子进程*/

execl("

/bin/ls"

"

ls"

-1"

-color"

NULL);

execfail!

default:

/*父进程*/

wait(NULL);

/*同步*/

lscompleted!

exit(0);

}

4、进程互斥

main( )

while((p1=fork())==-1);

lockf(1,1,0);

/*加锁,这里第一个参数为stdout(标准输出设备的描述符)*/

for(i=0;

lockf(1,0,0);

/*解锁*/

while((p2=fork())==-1);

if(p2==0)

/*加锁*/

{

lockf(1,1,0);

parent%d\n"

lockf(1,0,0);

5、守护进程

stdlib.h>

signal.h>

time_tt;

//建立time_t格式变量

FILE*fp;

//建立文件

fp=fopen("

/var/log/Mydaemon.log"

a"

//打开文件

pid_tpid;

//守护神

pid=fork();

if(pid>

0){

Daemononduty!

exit(0);

elseif(pid<

Can'

tfork!

exit(-1);

while

(1){

if(fp>

=0){

sleep(5);

//等待5秒再往文件中写入时间戳

t=time(0);

fprintf(fp,"

Thecurrenttimeis%s\n"

asctime(localtime(&

t)));

fclose(fp);

//关闭文件

6、信号通信机制

voidwaiting(),stop();

intwait_mark;

intp1,p2,stdout;

while((p1=fork())==-1);

if(p1>

0)

while((p2=fork())==-1);

if(p2>

wait_mark=1;

signal(SIGINT,stop);

/*接收到^c信号,转stop*/

waiting();

kill(p1,16);

/*向p1发软中断信号16*/

kill(p2,17);

/*向p2发软中断信号17*/

wait(0);

/*同步*/

else

signal(17,stop);

/*接收到软中断信号17,转stop*/

lockf(stdout,1,0);

Childprocess2iskilledbyparent!

lockf(stdout,0,0);

wait_mark=1;

signal(16,stop);

/*接收到软中断信号16,转stop*/

Childprocess1iskilledbyparent!

voidwaiting()

while(wait_mark!

=0);

voidstop()

wait_mark=0;

7、进程的管道通信

intpid1,pid2;

intfd[2];

charoutpipe[100],inpipe[100];

pipe(fd);

/*创建一个管道*/

while((pid1=fork())==-1);

if(pid1==0)

lockf(fd[1],1,0);

sprintf(outpipe,"

child1processissendingmessage!

"

/*把串放入数组outpipe中*/

write(fd[1],outpipe,50);

/*向管道写长为50字节的串*/

/*自我阻塞5秒*/

lockf(fd[1],0,0);

while((pid2=fork())==-1);

if(pid2==0)

{lockf(fd[1],1,0);

/*互斥*/

child2processissendingmessage!

write(fd[1

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

当前位置:首页 > 初中教育 > 科学

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

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