实验五进程间通信Word文档下载推荐.docx
- 文档编号:6474058
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:27
- 大小:26.38KB
实验五进程间通信Word文档下载推荐.docx
《实验五进程间通信Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验五进程间通信Word文档下载推荐.docx(27页珍藏版)》请在冰点文库上搜索。
0)/*在父进程中*/
{
while((p2=fork())==-1);
If(p2>
0)/*在父进程中*/
{
wait_mark=1;
waiting(0);
kill(p1,10);
kill(p2,12);
wait();
wait();
printf(“parentprocessiskilled!
\n”);
exit(0);
}
else/*在子进程2中*/
{
wait_mark=1;
signal(12,stop);
waiting();
lockf(1,1,0);
printf(“childprocess2iskilledbyparent!
lockf(1,0,0);
exit(0);
}
}
else/*在子进程1中*/
{
wait_mark=1;
signal(10,stop);
waiting();
lockf(1,1,0);
printf(“childprocess1iskilledbyparent!
lockf(1,0,0);
exit(0);
voidwaiting()
while(wait_mark!
=0);
voidstop()
wait_mark=0;
实验要求:
运行程序并分析结果。
如果把signal(SIGINT,stop)放在
号和
号位置,结果会怎样并分析原因。
该程序段前面部分用了两个wait(0),为什么?
该程序段中每个进程退出时都用了语句exit(0),为什么?
5.2信号机制实验
(二)
学习signal的函数的使用
利用signal的函数的机制来实习我们发送截获信号的功能
修改上面的程序,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),再观察程序执行时屏幕上出现的现象,并分析其原因。
intpid1,pid2;
intEndFlag=0;
pf1=0;
pf2=0;
voidIntDelete()
kill(pid1,10);
kill(pid2,12);
EndFlag=1;
voidInt1()
printf(“childprocess1iskilledbyparent!
voidInt2()
printf(“childprocess2iskilledbyparent!
main()
intexitcode;
signal(SIGINT,SIG_IGN);
signal(SIGQUIT,SIG_IGN);
while((pid1=fork())==-1);
if(pid1==0)
signal(SIGUSR1,Int1);
signal(SIGINT,SIG_IGN);
pause();
}
else
{
while((pid2=fork())==-1);
if(pid2==0)
{
signal(SIGUSR2,Int2);
else
signal(SIGINT,IntDelete);
waitpid(-1,&
exitcode,0);
/*等待任何子进程中断或结束*/
printf(“parentprocessiskilled\n”);
exit(0);
司机售票员问题(选做题)
编程用fork()创建一个子进程代表售票员,司机在父进程中,再用系统调用signal()让父进程(司机)捕捉来自子进程(售票员)发出的中断信号,让子进程(售票员)捕捉来自(司机)发出的中断信号,以实现进程间的同步运行。
5.3管道通信实验
(一)
1、了解什么是管道
2、熟悉UNIX/LINUX支持的管道通信方式
编写程序实现进程的管道通信。
用系统调用pipe()建立一管道,二个子进程P1和P2分别向管道各写一句话:
Child1issendingamessage!
Child2issendingamessage!
父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,后P2)。
参考程序
#include<
intpid1,pid2;
main()
intfd[2];
charoutpipe[100],inpipe[100];
pipe(fd);
/*创建一个管道*/
while((pid1=fork())==-1);
if(pid1==0)
lockf(fd[1],1,0);
sprintf(outpipe,"
child1processissendingmessage!
"
);
/*把串放入数组outpipe中*/
write(fd[1],outpipe,50);
/*向管道写长为50字节的串*/
sleep(5);
/*自我阻塞5秒*/
lockf(fd[1],0,0);
else
while((pid2=fork())==-1);
if(pid2==0)
{
lockf(fd[1],1,0);
/*互斥*/
child2processissendingmessage!
write(fd[1],outpipe,50);
sleep(5);
lockf(fd[1],0,0);
{
wait(0);
/*同步*/
read(fd[0],inpipe,50);
/*从管道中读长为50字节的串*/
printf("
%s/n"
inpipe);
wait(0);
printf("
五、运行结果
延迟5秒后显示
再延迟5秒
5.4管道通信实验
(二)
1、掌握有名管道的创建和读写方式
2、熟悉UNIX/LINUX支持的有名管道通信方式
1.创建有名管道
2.本进程执行循环等待数据被写入到管道中并读有名管道
3.打开有名管道并写数据到名管道
参考代码:
//read_fifo.c
stdlib.h>
sys/stat.h>
fcntl.h>
string.h>
errno.h>
#defineBUFFER_SIZE1024
intmain(intargc,char**argv)
intfd;
if(argc<
2)
fprintf(stdout,"
Usage:
%s<
filename>
\n"
argv[0]);
exit
(1);
//intopen(constchar*path,intoflag,...);
if((fd=open(argv[1],O_RDONLY))<
0)
fprintf(stderr,"
openfifo%sforreadingfailed:
%s\n"
argv[1],strerror(errno));
openfifo%sforreadingsuccessed.\n"
charbuffer[BUFFER_SIZE];
ssize_tn;
while
(1)
again:
//ssize_tread(intfd,void*buf,size_tcount);
if((n=read(fd,buffer,BUFFER_SIZE))<
if(errno==EINTR)
gotoagain;
readfailedon%s:
elseif(n==0)
peerclosedfifo.\n"
break;
buffer[n]='
\0'
;
read%dbytesfromfifo:
n,buffer);
return0;
//write_fifo.c
voidsignal_handler(ints);
signal(SIGPIPE,signal_handler);
if((fd=open(argv[1],O_WRONLY))<
openfifo%sforwrittingfailed:
openfifo%sforwrittingsuccessed.\n"
//char*fgets(char*s,intsize,FILE*stream);
while(fgets(buffer,BUFFER_SIZE,stdin))
//ssize_twrite(intfd,constvoid*buf,size_tcount);
if((n=write(fd,buffer,strlen(buffer)))<
write()failedonfifo:
strerror(errno));
//FIXME:
voidsignal_handler(ints)
Caughtsignal%d\n"
s);
//create_fifo.c
//intmkfifo(constchar*path,mode_tmode);
if(mkfifo(argv[1],0644)<
mkfifo()failed:
5.5共享内存通信实验
1、掌握共享内存的创建和读写方式
2、熟悉UNIX/LINUX支持的共享内存通信方式
1.创建共享内存
2.写入到共享内存
3.读数据从共享内存
代码参考:
//write.c
sys/types.h>
sys/mman.h>
#defineMAPPED_FILENAME"
/tmp/test.mmap.1"
//XXX:
step1,openfile,getafd
//intopen(constchar*pathname,intflags,mode_tmode);
if((fd=open(argv[1],O_RDWR|O_CREAT|O_EXCL,0644))<
if(errno==EEXIST)
Fatalerror:
Thetargetmappedfileexisted,exit.\n"
Error:
openfilefailed:
(errno=%d)%s\n"
errno,strerror(errno));
off_toffset;
offset=1024;
step2,createaholefile
//off_tlseek(intfildes,off_toffset,intwhence);
if(lseek(fd,offset,SEEK_SET)==(off_t)-1)
lseek()failed:
//FIXME:
unlinkthefile
close(fd);
if((n=write(fd,"
1))<
write()failed:
/*
*Onsuccess,mmapreturnsapointertothemappedarea.Onerror,thevalueMAP_FAILED(thatis,(void*)-1)isreturned,anderrnoissetappropriately.Onsuccess,munmapreturns0,onfailure-1,anderrnoisset(probablytoEINVAL).
*/
/*
PROT_EXECPagesmaybeexecuted.
PROT_READPagesmayberead.
PROT_WRITEPagesmaybewritten.
PROT_NONEPagesmaynotbeaccessed.
*/
void*p;
step3,mmap(),getapointer
//void*mmap(void*start,size_tlength,intprot,intflags,intfd,off_toffset);
if((p=mmap(NULL,1024,PROT_WRITE,MAP_SHARED,fd,0))==MAP_FAILED)
mmap()failed:
mappedfiletomemory,size=%d\n"
1024);
step4,read/writeonsharedmemory
char*banner="
helloworld."
//void*memcpy(void*dest,constvoid*src,size_tn);
memcpy(p+256,banner,strlen(banner));
step5,munmap();
//intmunmap(void*start,size_tlength);
pause();
//close(fd);
//read.c
if((fd=open(argv[1],O_RDWR))<
openfile
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 进程 通信