《Linux系统编程实验六:进程间通信》由会员分享,可在线阅读,更多相关《Linux系统编程实验六:进程间通信(10页珍藏版)》请在人人文库网上搜索。

1、实验六:进程间通信l 实验目的:学会进程间通信方式:无名管道,有名管道,信号,消息队列,l 实验要求:(一)在父进程中创建一无名管道,并创建子进程来读该管道,父进程来写该管道(二)在进程中为SIGBUS注册处理函数,并向该进程发送SIGBUS信号(三)创建一消息队列,实现向队列中存放数据和读取数据l 实验器材:软件:安装了Linux的vmware虚拟机硬件:PC机一台l 实验步骤:(一)无名管道的使用1、编写实验代码pipe_rw.c#include #include #include #include #include #include int main()int pipe_fd2;/管道返。

2、回读写文件描述符pid_t pid;char buf_r100;char* p_wbuf;int r_num;memset(buf_r,0,sizeof(buf_r);/将buf_r初始化char str1=”parent write1 “holle”;char str2=”parent write2 “pipe”n”;r_num=30;/*创建管道*/if(pipe(pipe_fd)0) /父进程执行代码/1、父进程先关闭了管道的读端close(pipe_fd0);/2、向管道写入字符串数据p_wbuf=&str1;write(pipe_fd1,p_wbuf,sizof(p_wbuf);p_。

3、wbuf=&str2;write(pipe_fd1,p_wbuf,sizof(p_wbuf);/3、关闭写端,并等待子进程结束后退出close(pipe_fd1);return 0;/*#include #include #include #include #include #include int main()int pipe_fd2;/管道返回读写文件描述符pid_t pid;char buf_r100;char* p_wbuf;int r_num;memset(buf_r,0,sizeof(buf_r);/将buf_r初始化char str1=holle;char str2=pipe;r。

4、_num=10;/*创建管道*/if(pipe(pipe_fd)0) /父进程执行代码close(pipe_fd0);/1、父进程先关闭了管道的读端p_wbuf=str1;/2、向管道写入字符串数据write(pipe_fd1,p_wbuf,sizeof(str1);sleep(1);p_wbuf=str2;write(pipe_fd1,p_wbuf,sizeof(str2);close(pipe_fd1);/3、关闭写端,并等待子进程结束后退出exit(1);/printf(father error!);return 0;*/2、编译应用程序pipe_rw.c3、运行应用程序子进程先睡两秒让。

5、父进程先运行,父进程分两次写入“hello”和“pipe”,然后阻塞等待子进程退出,子进程醒来后读出管道里的内容并打印到屏幕上再退出,父进程捕获到子进程退出后也退出4、由于fork函数让子进程完整地拷贝了父进程的整个地址空间,所以父子进程都有管道的读端和写端。我们往往希望父子进程中的一个进程写一个进程读,那么写的进程最后关掉读端,读的进程最好关闭掉写端(二)信号处理1、编写实验代码sig_bus.c#include #include #include /1、自定义信号处理函数,处理SIGBUS信号,打印捕捉到信号即可static void signal_handler(int signo)if。

6、(signo =SIGBUS)printf(“n I have get SIGBUS”);exit(EXIT_FAILURE);int main()printf(Waiting for signal SIGBUS n );/2、注册信号处理函数if(signal(SIGBUS,signal_handler)=SIG_ERR)fprintf(stderr,”cannot handle SIGBUSn”);exit(EXIT_FAILURE);pause();/将进程挂起直到捕捉到信号为止exit(0);return 0;/*#include #include #include #include 。

7、/1、自定义信号处理函数,处理SIGBUS信号,打印捕捉到信号即可static void signal_handler(int signo)if(signo =SIGBUS)printf(I have get SIGBUS);exit(EXIT_FAILURE);int main()printf(Waiting for signal SIGBUS n );/2、注册信号处理函数if(signal(SIGBUS,signal_handler)=SIG_ERR)fprintf(stderr,cannot handle SIGBUSn);exit(EXIT_FAILURE);pause();/将进程。

8、挂起直到捕捉到信号为止exit(0);return 0;*/用signal系统调用为SIGBUS信号注册信号处理函数my_func,然后将进程挂起等待SIGBUS信号。所以需要向该进程发送SIGBUS信号才会执行自定义的信号处理函数2、编译应用程序sig_bus.c3、运行应用程序先先一个终端中运行sig_bus,会看到进程挂起,等待信号然后在另一个终端中,查找到运行sig_bus这个产生的进程号,用kill命令发送SIGBUS信号给这个进程我们可以看到前面挂起的进程在接收到这个信号后的处理用自定义信号处理函数my_func来处理,所以打印了I have get SIGBUS这样一句话l 上机。

9、报告要求:1、 总结pipe(),signal()的函数定义原型,返回值和参数的意义表头文件: #include定义函数: int pipe(int filedes2);函数说明(参数): pipe()会建立管道,并将文件描述词由参数filedes数组返回。filedes0为管道里的读取端,filedes1则为管道的写入端。返回值:若成功则返回零,否则返回-1,错误原因存于errno中。阻塞问题:当管道中的数据被读取后,管道为空。一个随后的read()调用将默认的被阻塞,等待某些数据写入。功能:管道是一种把两个进程之间的标准输入和标准输出连接起来的机制,从而提供一种让多个进程间通信的方法,当进。

10、程创建管道时,每次都需要提供两个文件描述符来操作管道。其中一个对管道进行写操作,另一个对管道进行读操作。对管道的读写与一般的IO系统函数一致,使用write()函数写入数据,使用read()读出数据。表头文件:#include功 能:设置某一信号的对应动作函数原型:void (*signal(int signum,void(* handler)(int)(int); 或者:typedef void(*sig_t) ( int ); sig_t signal(int signum,sig_t handler);可看成是signal()函数(它自己是带有两个参数,一个为整型,一个为函数指针的函数)。

11、,而这个signal()函数的返回值也为一个函数指针,这个函数指针指向一个带整型参数,并且返回值为void的一个函数。参数说明:第一个参数signum指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号。 第二个参数handler描述了与信号关联的动作,它可以取以下三种值: (1)一个返回值为正数的函数地址此函数必须在signal()被调用前申明,handler中为这个函数的名字。当接收到一个类型为sig的信号时,就执行handler 所指定的函数。这个函数应有如下形式的定义: intfunc(int sig); sig是传递给它的唯一参数。执行了signal(。

12、)调用后,进程只要接收到类型为sig的信号,不管其正在执行程序的哪一部分,就立即执行func()函数。当func()函数执行结束后,控制权返回进程被中断的那一点继续执行。(2)SIGIGN 这个符号表示忽略该信号,执行了相应的signal()调用后,进程会忽略类型为sig的信号。 (3)SIGDFL 这个符号表示恢复系统对信号的默认处理。 函数说明:signal()会依参数signum 指定的信号编号来设置该信号的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。当一个信号的信号处理函数执行时,如果进程又接收到了该信号,该信号会自动被储存而不会中断信号处理函数的执行,直到。

13、信号处理函数执行完毕再重新调用相应的处理函数。但是如果在信号处理函数执行时进程收到了其它类型的信号,该函数的执行就会被中断。返回值:返回先前的信号处理函数指针,如果有错误则返回SIG_ERR(-1)。 附加说明:在信号发生跳转到自定的handler处理函数执行后,系统会自动将此处理函数换回原来系统预设的处理方式,如果要改变此操作请改用sigaction()。下面的情况可以产生Signal: 1. 按下CTRL+C产生SIGINT 2. 硬件中断,如除0,非法内存访问(SIGSEV)等等 3. Kill函数可以对进程发送Signal 4. Kill命令。实际上是对Kill函数的一个包装 5.软件。

14、中断。如当Alarm Clock超时(SIGURG),当Reader中止之后又向管道写数据(SIGPIPE),等等命名管道FIFO功能:管道最大的劣势就是没有名字,只能用于有一个共同祖先进程的各个进程之间。FIFO代表先进先出,单它是一个单向数据流,也就是半双工,和管道不同的是:每个FIFO都有一个路径与之关联,从而允许无亲缘关系的进程访问。 头文件:#include #include 函数定义原型:int mkfifo(const char *pathname, mode_t mode);参数:这里pathname是路径名,mode是sys/stat.h里面定义的创建文件的权限.2、 利用有。

15、名管道FIFO实现类似第一个实验的功能,一个程序fifo_read.c写数据”Hi Linux”,另一个程序fifo_write.c读数据并打印出来。/fifo.read.c#include #include #include #include #include #include #include #include /#define FIFO fifoint main()int fdr,fd;char buf_r=Hi Linuxn;fd=mkfifo(fifo.txt,O_CREAT|O_RDWR|0666);if(fd#include #include #include #include #include #include #include /#define FIFO fifoint main()int fdw,fd;char buf100;memset(buf,0,sizeof(buf);fdw=open(fifo.txt,O_RDONLY);if(fdw0)printf(open error(W)!);exit(-1);/sleep(2);if(read(fdw,buf,100)0)printf(read error(W);exit(-1);printf(n%s,buf);close(fdw);return 0。

实验六 Linux进程编程,Linux系统编程实验六:进程间通信相关推荐

  1. linux服务器开发二(系统编程)--线程相关

    线程概念 什么是线程 LWP:Light Weight Process,轻量级的进程,本质仍是进程(在Linux环境下). 进程:独立地址空间,拥有PCB. 线程:也有PCB,但没有独立的地址空间(共 ...

  2. linux系统编程_Linux系统编程:进程间通信

    进程的重要性对于编程人员来说,至关重要,那么,进程间是如何通信的呢?在一个大的项目中,进程间的通信有哪些方式,这对于我们程序员来说也是很重要的一个点?那么本节我们就来聊聊进程间通信的方式,以及各自的优 ...

  3. 嵌入式项目_嵌入式Linux项目分享_linux系统编程

    分享一个适合入门嵌入式linux系统编程的项目,其他项目见:牛客嵌入式项目 同时附上本人编写的两个牛客高级专栏: <100道安卓常见面试题全解析> <嵌入式 面经C++软件开发 面经 ...

  4. Linux实验三父子进程每隔3秒,实验三进程的创建和简单控制(学生分析.doc

    实验三进程的创建和简单控制(学生分析 实验 进程的创建和简单控制 实验目的: 掌握进程的概念和进程的状态,对进程有感性的认识: 掌握进程创建方法: 认识进程的并发执行,了解进程族之间各种标识及其存在的 ...

  5. linux进程自动启动,linux 嵌入式 自启动 系统自动登录-自动启动程序或脚本

    linux嵌入式开发板,设置系统自动登录和自动运行脚本或程序,下面一一进行说明. 一.系统自动登录 1.1.在实验板添加logintest脚本 logintest脚本位置:/home/root/    ...

  6. Linux进程调度策略的发展和演变--Linux进程的管理与调度(十六)

    日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 ...

  7. 【Linux进程】Linux进程

    Linux进程 Linux进程介绍 程序和进程 进程并发 CPU和MMU PCB 环境变量 Linux进程控制 创建子进程(fork函数) 子进程切换执行的代码(exec函数族) 回收子进程(wait ...

  8. unix环境高级编程 pdf_UNIX系统编程宝典,每一本都值得程序员珍藏

    这几本UNIX系统编程宝典,重印无数次,几代程序员都视如珍宝的几本书,小编在出版圈里快十年了,见证了这本书图灵版.异步社区版的出版.营销,对这套书倾注了一定的感情.今天继续分享给你们,好书总会有人还不 ...

  9. Linux进程 管理,Linux进程查看与管理以及作业控制

    Linux进程查看与管理 静态结构:重底层开始往上 底层:硬件 kernel(OS):各硬件接口封装成简洁的接口 库:将内核功能封装成功能模块,供程序员研发使用 OS的基本功能:文件系统.网络功能.进 ...

  10. linux进程属性,Linux进程属性及含义

    一个进程包含多个属性参数,通过使用 ps 命令,我们可以查看当前系统中有关进程的详细信息,例如: [root@localhost ~]# ps -le F S UID PID PPID C PRI N ...

最新文章

  1. ACM MM'21 | 超轻量8.5M!更高效的RGB-D显著性检测模型DFM-Net
  2. Qt 图形视图框架中的事件处理和传播
  3. php+mysql留言板小案例
  4. 霍金一生重要时刻照片合集,3次来中国,年轻时也是帅哥一枚
  5. mysql addslashes_PHP函数addslashes和mysql_real_escape_string的区别
  6. Twisted twisted.python.log日志
  7. STM32 - 定时器高级应用说明 - 01 - Filtering stage - 波形输入的过滤
  8. 降序php,以降序php读取文件
  9. Rem实现自适应初体验
  10. 产品经理基本功之PRD
  11. 2021最新微信漫画小程序全开源商业版:带漫画资源,带搭建教程,流量变现利器。附安装说明和源码。
  12. 数学差考研考计算机专业,2021考研数学基础差,这4大方法让你快速上手_计算机专业考研...
  13. Linux环境运行jmeter+测试报告查看
  14. 编制职工档案管理程序C语言,职工档案管理系统
  15. 如何将pdf文件转换成图片格式,插入到word中
  16. 用计算机亩换算成平方,亩换算(平方米换算亩计算器)
  17. 蓝桥杯 算法训练 寂寞的数
  18. office2007每次打开都配置进度_win7下office2007总是配置进度怎么办-解决office2007显示配置进度的方法 - 河东软件园...
  19. Opencv实现颜色检测
  20. FPGA mpsoc vitis SDK PMU-FW is not running, certain application may not be supported

热门文章

  1. 2021年CISCN初赛re
  2. PECompact3.0
  3. 【web安全】Spring Boot eureka xstream 反序列化
  4. 7、实例:计算课程结束的日期
  5. Python基于socket实现的TCP服务端
  6. 三种插入排序算法:直接插入排序、折半插入排序、希尔插入排序
  7. Acwing第 31 场周赛【完结】
  8. P3385 【模板】负环
  9. Dubbo架构的特点
  10. jQuery的遍历方法