操作系统原理实验报告最终版文档格式.docx
- 文档编号:14306221
- 上传时间:2022-10-21
- 格式:DOCX
- 页数:28
- 大小:773.08KB
操作系统原理实验报告最终版文档格式.docx
《操作系统原理实验报告最终版文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统原理实验报告最终版文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
1.根据实验内容编写C程序。
2.上机调试程序。
3.记录并分析程序运行结果。
四、程序说明和程序流程图
实验1管道通信——所涉及的流程图:
实验2软中断信号——所涉及的流程图:
五、程序代码
/*expe1_1.c*/
#include<
stdio.h>
voidmain()
{
inti,r,p1,p2,fd[2];
charbuf[50],s[50];
pipe(fd);
/*父进程建立管道*/
while((p1=fork())==-1);
/*创建子进程P1,失败时循环*/
if(p1==0)/*由子进程P1返回,执行子进程P1*/
{
lockf(fd[1],1,0);
/*加锁锁定写入端*/
sprintf(buf,"
ChildprocessP1issendingmessages!
\n"
);
printf("
ChildprocessP1!
write(fd[1],buf,50);
/*把buf中的50个字符写入管道*/
sleep(5);
/*睡眠5秒,让父进程读*/
lockf(fd[1],0,0);
/*释放管道写入端*/
exit(0);
/*关闭P1*/
}
else/*从父进程返回,执行父进程*/
while((p2=fork())==-1);
/*创建子进程P2,失败时循环*/
if(p2==0)/*从子进程P2返回,执行子进程P2*/
/*锁定写入端*/
ChildprocessP2issendingmessages!
ChildprocessP2!
/*把buf中的字符写入管道*/
/*关闭P2*/
wait(0);
if((r=read(fd[0],s,50))==-1)
printf("
cannotreadpipe!
elseprintf("
%s"
s);
}
/*exp1-2.c*/
#include<
stdlib.h>
signal.h>
intp1,p2;
voidmain()
voidppdo();
voidp1do();
voidp2do();
signal(SIGINT,ppdo);
p1=fork();
if(p1==0)
{
signal(SIGUSR1,p1do);
for(;
;
else{
p2=fork();
if(p2==0){
signal(SIGUSR2,p2do);
for(;
\nParentprocessiskilled!
\n"
voidppdo()
kill(p1,SIGUSR1);
kill(p2,SIGUSR2);
voidp1do()
\nChildprocessp1iskilledbyparent!
voidp2do()
\nChildprocessp2iskilledbyparent!
六、程序运行结果及分析
实验1管道通信运行结果截图
实验1管道通信结果分析
父进程建立后,创建了子进程P1,P2,然后P1,P2分别向管道中写入字符串“Childprocessp1issendingmessage!
”和“Childprocessp2issendingmessage!
”,父进程从管道中读取字符串。
实验2软中断通信运行结果截图
实验2软中断通信结果分析
先预设中断信号SIGINT,再先后创建子进程P1和P2,预设中断信号SIGUSR1,SIGUER2,当我们按下“Ctrl+C”时,父进程发出中断信号SIGUSR1和SIGUSR2,通知子进程P1和P2,子进程捕捉到信号后分别输出相应的信息后,终止,最后输出“Parentprocessiskilled!
实验后思考:
通过这次实验,深刻地了解到了管道通信和软中断通信的详细过程,深化了老师课堂上的讲解,对整个过程的把握也更加清晰了。
很值得的一次学习经历,做完实验,再画流程图,程序运行的细节熟悉于心,了如指掌。
七.指导教师评议
成绩等级
实验2进程通信
1.了解进程间通信IPC的三种方式:
消息队列、共享内存和信号量。
2.掌握使用消息队列进行进程间通信的有关系统调用和编程方法。
3.掌握使用共享内存进行进程间通信的有关系统调用和编程方法。
1.消息队列
使用系统调用msgget()、msgsnd()、msgrcv()和msgctl(),用消息队列机制实现客户进程和服务器进程间的通信。
客户进程首先建立一个描述符为msgqid的消息队列,接着向服务器进程发送一个消息正文为自己的进程标识pid且类型为1的消息,然后接收来自服务器进程的消息,并在屏幕上显示:
“Clientreceivesamessagefromxxxx!
”,其中“xxxx”为服务器进程的进程标识。
服务器进程首先捕捉软中断信号(除不能捕捉的SIGKILL),若捕捉到时则调用函数cleanup()删除消息队列,终止服务器进程。
否则重复下列操作:
接收所有类型为1的消息,并在屏幕上显示:
“Serverreceivesamessagefromxxxx!
”,其中“xxxx”为客户进程的进程标识;
然后服务器进程将客户进程的进程标识作为返回消息的类型,而将自己的进程标识作为消息正文发送给客户进程。
2.共享内存
使用系统调用shmget()、shmat()和shmctl(),用共享内存机制实现进程间的通信。
其中一个进程向共享内存中写入数据,另一个进程从共享内存中读出数据并显示在屏幕上。
实验1消息队列流程图
实验1消息队列
/*msg_client.c*/
sys/types.h>
sys/ipc.h>
sys/msg.h>
#defineMSGKEY75
structmsgform
longmtype;
charmtext[256];
main()
structmsgformmsg;
intmsgqid,pid,*pint;
/*文件主同组用户其他用户rwxrwxrwx*/
msgqid=msgget(MSGKEY,0777);
/*rw-rw-rw-*/
pid=getpid();
pint=(int*)msg.mtext;
*pint=pid;
msg.mtype=1;
msgsnd(msgqid,&
msg,sizeof(int),0);
msgrcv(msgqid,&
msg,256,pid,0);
client:
receivefrompid%d\n"
*pint);
/*msg_server.c*/
{longmtype;
}msg;
intmsgqid;
inti,pid,*pint;
externcleanup();
for(i=0;
i<
20;
i++)
signal(i,cleanup);
msgqid=msgget(MSGKEY,0777|IPC_CREAT);
for(;
)
{msgrcv(msgqid,&
msg,256,1,0);
pid=*pint;
server:
pid);
msg.mtype=pid;
*pint=getpid();
msg,
sizeof(int),0);
}}
cleanup()
msgctl(msgqid,IPC_RMID,0);
实验2共享内存
sys/shm.h>
#defineSHMKEY75
#defineK1024
intshmid;
inti,*pint;
char*addr;
externchar*shmat();
shmid=shmget(SHMKEY,8*K,0777);
addr=sh
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 原理 实验 报告 最终版