资源描述:
《实验五进程间通信实验(二).doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、个人收集整理勿做商业用途实验五进程间通信实验(二)实验目的:1.通过基础实验,基本掌握无名管道、有名管道的程序设计。2.通过编写程序,使读者掌握信号处理程序设计方法。实验内容:1.无名管道程序设计:在父进程中创建一个无名管道,并创建子进程;在父进程中写该管道,并用子进程将内容读出。2.有名管道程序设计:创建两个进程,在A进程中创建一个有名管道,并向其写入数据,通过B进程从有名管道中读出数据。3.信号处理程序设计:在进程中为SIGBUS注册处理函数,并向该进程发送SIGBUS信号来触发信号处理函数。实验过程:(一)无名
2、管道程序设计实验代码:/*pipe.c*/#include<unistd.h>#include <sys/types.h>#include #include #include#include <string.h>#defineMAX_DATA_LEN256#define DELAY_TIMEﻩ1int main(){pid_tpid;ﻩintpipe_fd[2];ﻩchar buf[MAX_DATA_LEN];ﻩconst char data[]= "Pipe
3、TestProgram";ﻩintreal_read,real_write;ﻩﻩmemset((void*)buf,0,sizeof(buf));ﻩﻩ/*创建管道*/ﻩif(pipe(pipe_fd)<0){个人收集整理勿做商业用途ﻩprintf("pipecreate errorn");ﻩexit(1);}ﻩﻩ/*创建一子进程*/ﻩif((pid= fork())==0){ﻩ/*子进程关闭写描述符,并通过使子进程暂停1秒等待父进程已关闭相应的读描述符*/ﻩﻩclose(pipe_fd[1]);ﻩsleep(DEL
4、AY_TIME *3);ﻩﻩﻩ/*子进程读取管道内容*/ﻩif((real_read=read(pipe_fd[0],buf,MAX_DATA_LEN))> 0)ﻩ{ﻩﻩprintf("%dbytes readfromthepipeis'%s'",real_read,buf);ﻩ}ﻩﻩ/*关闭子进程读描述符 */ﻩclose(pipe_fd[0]);ﻩexit(0);}ﻩelseif(pid > 0)ﻩ{/* 父进程关闭读描述符,并通过使父进程暂停1秒等待子进程已关闭相应的写描述符 */ﻩclose(pipe_f
5、d[0]);sleep(DELAY_TIME);ﻩﻩﻩ/*父进程向管道中写入字符串*/if((real_write=write(pipe_fd[1],data, strlen((const char*)data)))!=-1)ﻩﻩ{ﻩprintf("Parentwrote%dbytes :'%s'\n",real_write, data);}ﻩﻩ/*关闭父进程写描述符*/ﻩclose(pipe_fd[1]);ﻩﻩ/*收集子进程退出信息*/ﻩwaitpid(pid,NULL,0);exit(0);ﻩ}}将该程序编译,运
6、行。#./pipe……(二)有名管道程序设计个人收集整理勿做商业用途1.编写一个应用程序,包含两个程序,一个用于读管道,一个用于写管道。其中在读管道的程序里创建管道,并且作为main()函数里的参数由用户输入要写入的内容。读管道的程序会读出用户写入到管道的内容,这两个程序采用的是阻塞式读写管道模式。实验代码:(1)写管道的程序/* fifo_write.c */#include#include#include<errno.h>#include#inc
7、lude<stdio.h>#include <stdlib.h>#include<limits.h>ﻩ#defineMYFIFOﻩ"/tmp/myfifo"ﻩ/*有名管道文件名*/#define MAX_BUFFER_SIZEﻩPIPE_BUF/*定义在于limits.h中*/ﻩintmain(intargc,char*argv[])/*参数为即将写入的字符串*/{ﻩintfd;ﻩcharbuff[MAX_BUFFER_SIZE];intnwrite;ﻩﻩif(argc<=1){printf("Usage:./fif
8、o_writestringn");ﻩexit(1);ﻩ}ﻩsscanf(argv[1], "%s", buff);ﻩ/* 以只写阻塞方式打开FIFO管道 */ﻩfd=open(MYFIFO,O_WRONLY);ﻩif (fd==-1)ﻩ{ﻩprintf("Openfifofileerror\n");ﻩexit(1);ﻩ}/*向管道中写入字符串