版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验五 进程间通信实验(二)实验目的:1. 通过基础实验,基本掌握无名管道、有名管道的程序设计。2. 通过编写程序,使读者掌握信号处理程序设计方法。实验内容:1. 无名管道程序设计:在父进程中创建一个无名管道,并创建子进程;在父进程中写该管道,并用子进程将内容读出。2. 有名管道程序设计:创建两个进程,在A进程中创建一个有名管道,并向其写入数据,通过B进程从有名管道中读出数据。3. 信号处理程序设计:在进程中为SIGBUS注册处理函数,并向该进程发送SIGBUS信号来触发信号处理函数。实验过程:(一)无名管道程序设计实验代码:/* pipe.c */#include #include #inc
2、lude #include #include #include #define MAX_DATA_LEN256#define DELAY_TIME1int main()pid_t pid;int pipe_fd2;char bufMAX_DATA_LEN;const char data = Pipe Test Program;int real_read, real_write;memset(void*)buf, 0, sizeof(buf);/* 创建管道 */if (pipe(pipe_fd) 0)printf(%d bytes read from the pipe is %sn, real
3、_read, buf);/* 关闭子进程读描述符 */close(pipe_fd0);exit(0);else if (pid 0)/* 父进程关闭读描述符,并通过使父进程暂停1秒等待子进程已关闭相应的写描述符 */close(pipe_fd0);sleep(DELAY_TIME);/* 父进程向管道中写入字符串 */if(real_write = write(pipe_fd1, data, strlen(const char*)data) != -1)printf(Parent wrote %d bytes : %sn, real_write, data);/*关闭父进程写描述符*/clos
4、e(pipe_fd1);/*收集子进程退出信息*/waitpid(pid, NULL, 0);exit(0); 将该程序编译,运行。#./pipe(二)有名管道程序设计1.编写一个应用程序,包含两个程序,一个用于读管道,一个用于写管道。其中在读管道的程序里创建管道,并且作为main()函数里的参数由用户输入要写入的内容。读管道的程序会读出用户写入到管道的内容,这两个程序采用的是阻塞式读写管道模式。实验代码:(1)写管道的程序/* fifo_write.c */#include #include #include #include #include #include #include #defi
5、ne MYFIFO/tmp/myfifo/* 有名管道文件名*/#define MAX_BUFFER_SIZEPIPE_BUF /*定义在于limits.h中*/int main(int argc, char * argv) /*参数为即将写入的字符串*/int fd;char buffMAX_BUFFER_SIZE;int nwrite;if(argc 0)printf(Write %s to FIFOn, buff);close(fd);exit(0);(2)读管道的程序/* fifo_read.c */#include #include #include #include #includ
6、e #include #include #include #define MYFIFO/tmp/myfifo#define MAX_BUFFER_SIZEPIPE_BUF /*定义在于limits.h中*/int main()char buffMAX_BUFFER_SIZE;int fd;int nread;/* 判断有名管道是否已存在,若尚未创建,则以相应的权限创建*/if (access(MYFIFO, F_OK) = -1) if (mkfifo(MYFIFO, 0666) 0)printf(Read %s from FIFOn, buff);close(fd);exit(0);为了能够
7、较好地观察运行结果,需要把这两个程序分别在两个终端里运行,首先启动读管道程序。读管道进程在建立管道之后就开始循环地从管道里读出内容,如果没有数据可读,则一直阻塞到写管道进程向管道写入数据。在启动了写管道程序后,读进程能够从管道里读出用户的输入内容。# ./fifo_read终端二#./fifo_write FIFO#./fifo_write Test #./fifo_write Program(三)信号处理程序设计实验要求:编写一个应用程序,用signal注册信号处理函数,并用kill发送相应信号触发信号处理。 信号概念。信号是一种进程间的通信机制,它为应用程序提供一种异步的软件中断,使应用程
8、序有机会接收其它程序或终端发送的命令(即信号)。应用程序收到信号后,有三种处理方式:忽略、默认和捕捉。进程收到一个信号后,会检查对该信号的处理机制。如果是SIG_IGN,就忽略该信号;如果SIG_DFT,则采用系统默认的处理动作,通常是终止进程或忽略该信号;如果为该信号指定了一个处理函数(捕捉),则会中断当前进程正在执行的任务,转而去执行该信号的处理函数,返回后再继续执行被中断的任务。 常用信号说明:通过kill l命令可以查看到Linux支持的信号列表。实验代码及步骤:功能描述:在进程中为SIGBUS注册处理函数,并向该进程发送SIGBUS信号来触发信号处理函数。/*sig_bus.c*/#include#include#include/*自定义的信号处理函数*/ void my_func(int sign_no) if(sign_no=SIGBUS) printf(I have get SIGBUSn); int main() printf(Waiting for signal SIGBUSn);/*注册信号处理函数*/ signal(SIGBUS,my_func); pause(); /将进程挂起,直到捕捉到信号为止 exit(0);1)对程序进行编辑和编译2)在一个终端中运行sig_bus,会看到进程挂起,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能穿戴产品可靠功能保障承诺函(3篇)
- 2026届浙江省嘉兴、舟山重点达标名校初三英语试题复习作业含解析
- 工程项目质量保障责任承诺书5篇范文
- 会议纪要快速生成与分发模板
- 幸福家园守护责任书5篇
- 企业信用信息查询回复(5篇)
- 准时完成生产订单承诺书5篇
- 维护信息隐秘安全承诺书范文6篇
- 企业品宣活动策划及执行工具集
- 公共关系危机传播管理预案
- 《利用勾股定理解决最短路径问题【转化思想】》专题课件
- 口腔科合理用药知识培训课件
- 教师政治站位方面存在的问题及整改措施
- 2025至2030中国水务行业发展分析及投资前景与战略规划报告
- 医学单招考试题库及答案
- 妇幼公卫项目培训课件
- 倒睫科普课件
- 水培植物培训基础知识课件
- 加油站消防应急演练详细方案
- 湖南信息学院《数据结构与算法Ⅱ》2024-2025学年第一学期期末试卷
- 医院精麻药品规范化管理培训
评论
0/150
提交评论