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