操作系统实验报告进程通信管理资料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
漳州师范学院
实验报告
班级 13网络1班学号1308990337 姓名
成绩
同组人
1.软中断通信
编制一段程序,使用系统调用 fork()创建两个子进程,再用系统调用 signal ()让父进程捕捉键盘上来的中断信号(即按 ctrl+c 键),当捕捉到 中断信号后,父进程用系统调用 kill ()向两个子进程发出信号,子进程捕 捉到信号后,分别输出下列信息后终止: child process 1 is killed by parent! child process 2 is killed by parent!
父进程等待两个子进程终止后,输出一下信息后终止: parent process is killed! 程序:
#include
int p1,p2;
while((p1=fork())==-1); if(p1>0) //父进程产生子进程 1 {
while((p2=fork())==-1);
if(p2>0)//父进程产生了一个子进程 2 {//父进程
printf("parent\n");
wait_mark=1;//将等待标志设置为 1 signal(SIGINT,stop); waiting(); kill(p1,16);// kill(p2,17); wait(0); wait(0);
printf("parent process is killed!\n");// 父进程等待两个子进程终止后,输出一下信息后终止 exit(0); } else {//子进程 2
printf("p2\n"); wait_mark=1; signal(17,stop); waiting(); lockf(1,1,0);
闽 南 师 范 大 学
实 验 内 容 与 具 体 步 骤
printf("child process 2 is killed by parent!\n");
lockf(1,0,0);
exit(0);
}
}
else
{//子进程1
printf("p1\n");
wait_mark=1;
signal(16,stop);
waiting();
lockf(1,1,0);
printf("child process 1 is killed by parent!\n");
lockf(1,0,0);
exit(0);
}
}
void waiting()
{
while(wait_mark!=0);
}
void stop()
{
wait_mark=0;
}
1.分析结果并理解以上程序。
理解分析:1.先创建父进程,由父进程分别产生子进程1和子进程2,依次输出
p1,p2,parent。
2.给父进程中断信号,父进程终止子进程,运行stop函数wait_mark=0;跳出waiting函数,输出parent process is killed!
2.修改程序,查看修改前结果跟修改后结果的区别,分析原因。
......
else{
signal(SIGINT,SIG_IGN); /* add this line */
signal(17,stop);
... ...
... ...}
}
else{
signal(SIGINT,SIG_IGN); /* add this line */
signal(16,stop);
... ...
... ...
理解分析:1.先创建父进程,由父进程分别产生子进程1和子进程2,依次输出
p1,p2,parent。
2. 给父进程中断信号,父进程开始终止子进程,但是由于添加了signal(SIGINT, SIG_IGN);语句,相当于使子进程忽略键入信号,此时按ctrl+c不会将子进程终止,程序可以正常运行。于是输出child process 1 is killed by parent!和child process2is killed by parent!
2.进程的管道通信
编制一段程序,实现进程的管道通信。使用系统调用 pipe()建立一条管道线。 两个子进程 p1 和 p2 分别向管道各写一句话: Child 1 is sending a message! Child 2 is sending a message!
而父进程则从管道中读出来自两个子进程的信息,显示在屏幕上。
程序: #include
int fd[3];
char OutPipe[100],InPipe[100];
pipe(fd);//fd[0]存管道的读入端,fd[1]是管道的写入端
while((pid1=fork())==-1);
if(pid1==0)//对子进程 1 的操作 {
printf("p1\n");
lockf(fd[1],1,0);//对管道写入端进行软锁
sprintf(OutPipe,"Child 1 is sending a message!");//Outipe 数组存放"Child.." write(fd[1],OutPipe,50);//把 OutPipe 的内容写入管道 sleep(1);
lockf(fd[1],0,0);//释放对管道写入端的锁定 exit(0); }
else//父进程产生的了子进程 p1 {
while((pid2=fork())==-1); if(pid2==0)//由 p1 产生子进程 p2 {
printf("p2\n");
lockf(fd[1],1,0);//对管道写入端进行软锁
sprintf(OutPipe,"Child 2 is sending a message!");//Outipe 数组存放"Child.." write(fd[1],OutPipe,50);//把 OutPipe 的内容写入管道 sleep(1);
lockf(fd[1],0,0);//释放对管道写入端的锁定 exit(0); } else {
printf("parent\n"); wait(0);//暂停当前进程的执行
实 验 内 容 与 具 体 步 骤