操作系统实验报告进程通信管理资料

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 #include #include void waiting(); void stop(); int wait_mark; int main() {

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 #include #include int pid1,pid2; main() {

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);//暂停当前进程的执行

实 验 内 容 与 具 体 步 骤

相关文档
最新文档