东北大学操作系统实验三

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

相关文档
最新文档