东北大学操作系统实验三
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
实验名称实验三进程通信
班级
学号
姓名
日期2014.1.13
成绩
评阅人
软件学院
(一)信号量机制实验
【实验目的】
1.了解什么是信号。
2.熟悉LINUX系统中进程之间软中断通信的基本原理。【实验报告】
1.
#include
#include
#include
void waiting(),stop();
int wait_mark;
main()
{
int p1,p2;
if(p1=fork()) /*创建子进程p1*/
{ if(p2=fork()) /*创建子进程p2*/
{wait_mark=1;
signal(SIGINT,stop); /*接收到^c信号,转stop*/
waiting();
kill(p1,16); /*向p1发软中断信号16*/
kill(p2,17); /*向p2发软中断信号17*/
wait(0); /*同步*/
wait(0);
printf("parent process is killed!\n");
exit(0);
}
else
{wait_mark=1;
signal(SIGINT,stop);
waiting();
lockf(1,0,0);
printf("child process2 is killed by parent!\n");
lockf(1,0,0);
exit(0);
}
}
else
{wait_mark=1;
signal(SIGINT,stop);
waiting();
lockf(1,0,0);
printf("child process1 is killed by parent!\n");
lockf(1,0,0);
exit(0);
}
}
void waiting()
{while (wait_mark!=0);
}
void stop()
{wait_mark=0;
}
2.
#include
#include
#include
int pid1,pid2;int EndFlag=0;int pf1=0;int pf2=0; void IntDelete()
{ kill(pid1,16);
kill(pid2,17);
EndFlag=1;
}
void Int1()
{ printf("child process 1 is killed !by parent\n");
exit(0);
}
void Int2()
{ printf("child process 2 is killed !by parent\n");
exit(0);
}
main()
{ int exitpid;
signal(SIGINT,SIG_IGN);
signal(SIGQUIT,SIG_IGN);
if(pid1=fork())
{signal(SIGUSR1,Int1);
signal(SIGINT,SIG_IGN);
pause();
exit(0);
}
else
{if(pid2=fork())
{signal(SIGUSR1,Int1);
signal(SIGINT,SIG_IGN);
pause();
exit(0);
}
else
{signal(SIGINT,IntDelete);
waitpid(-1,&exitpid,0);
printf("parent process is killed\n");
exit(0);
}
}
}
〈分析〉
由于忽略了中断与退出信号,程序会一直保持阻塞状态而无法退出。(二)进程的管道通信实验
【实验目的】
1.了解什么是管道
2.熟悉UNIX/LINUX支持的管道通信方式
【实验内容】
1.〈程序〉
#include
#include
#include
int pid1,pid2;
main( )
{ int fd[2];
char outpipe[100],inpipe[100];
pipe(fd); /*创建一个管道*/
while ((pid1=fork( ))==-1);
if(pid1==0)
{ lockf(fd[1],1,0);
sprintf(outpipe,"child 1 process is sending message!");
write(fd[1],outpipe,50); /*向管道写长为50字节的串*/
sleep(5); /*自我阻塞5秒*/
lockf(fd[1],0,0);
exit(0);
}else
{ while((pid2=fork( ))==-1);
if(pid2==0)
{ lockf(fd[1],1,0); /*互斥*/
sprintf(outpipe,"child 2 process is sending message!");
write(fd[1],outpipe,50);
sleep(5);
lockf(fd[1],0,0);
exit(0);
}
else
{ wait(0); /*同步*/
read(fd[0],inpipe,50); /*从管道中读长为50字节的串*/
printf("%s\n",inpipe);
wait(0);
read(fd[0],inpipe,50);