进程间的通讯方式:

管道、信号、共享内存、消息队列、信号量、套接字

1.管道

1)无名管道

特点:

不会在进程空间产生一个实实在在的管道文件;

只有用于亲缘关系的进程;

数据读出后就不存在管道;

创建无名管道的时候,会直接得到两个文件描述符,有了文件描述符就可以像管道中读取或者写入数据;

无名管道有固定的读端和写端;

读取空管道进程或者管道写满数据时,都会发生阻塞,最多65536个字节;

pipe():创建无名管道

头文件: #include <unistd.h>

原型:int pipe(int filedes[2]);(参数是一个数组,传参数组名即可)

参数:

filedes:接收打开管道文件的文件描述符0

filedes[0]:存放管道文件的读端

f        iledes[1]:存放管道文件的写端

返回值:成功返回0,失败返回-1

注意:

1)调用pipe的时候必须在fork函数之前

2)只有在读端存在时向管道写入内容才有意义

3)父子进程运行的先后顺序不确定 为了保证父进程先执行可以在子进程sleep(1)

2)有名管道

特点:(其它和无名管道一样)

会创建真实管道文件

任意两个进程间都能通讯

makefifo():创建一个有名管道

头文件:

#include <sys/stat.h>

#include<sys/types.h>

原型:int mkfifo(const char * pathname,mode_t mode)

参数:

pathname:要创建的管道文件的名字(带路径)

mode:创建的FIFO文件的权限

返回值:成功返回0,失败返回-1

注:在有名管道里,读端只能以只读的方式打开文件,写端只能以只写的方式打开文件

unlink():有名管道的删除(也可以删普通文件,不能删目录)

头文件: #include <unistd.h>

原型:int unlink(const char * pathname)

参数:pathname:要删除的FIFO文件的名字(带路径)

返回值:成功返回0,失败返回-1

2.信号

1)信号是用来通知进程要干什么的。

中断是打断当前正在执行的事情转而去做另外的事情,要保护现场(压栈),另外的事情做完之后,再回过来做没有做完的事,在做这个事情之前要恢复现场(出栈)。

2)周期

产生 注册 注销 执行信号处理函数

3)信号查看

终端输入:kill -l      62个信号

部分信号类型:

2) SIGINT  键盘中断  ctrl+c

3) SIGQUIT   ctrl+\

9) SIGKILL  kill信号

14) SIGALRM  时钟信号

信号的相关说明

32位之前叫做不可靠信号,实时性不好  易丢失

32位之后位扩充信号,实时性较好   不易丢失

4)信号的产生

在终端输入Ctrl+c、 Ctrl+\、kill -9

内核在产生异常的时候也会发送一个信号

在进程里可以通过调用kill函数来给另一个进程发送信号

5)相关函数

kill():向指定进程发指定的信号

头文件: #include <signal.h>

原型:int kill(pid_t pid, int sig);

参数:

pid:要给谁发信号

sig:要发送的信号

返回值:成功返回0,失败返回-1

raise():向本身发送指定的信号

头文件: #include <signal.h>

原型:int raise(int sig);

参数: sig:要发送的信号类型

返回值:成功返回0,失败返回-1

pause():阻塞一个进程,直至捕捉到一个信号

头文件: #include<unistd.h>

原型:int pause(void);

参数: 无

返回值: -1

alarm():设置时间,时间到了之后产生一个14号信号,杀死自己。

头文件: #include<unistd.h>

原型:unsigned int alarm(unsigned int seconds);

参数: seconds:经过指定的时间(秒数)后产生信号

返回值: 如果调用此alarm()前,进程已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0。

signal():设置信号处理方式

头文件: #include<signal.h>

原型:sighandler_t signal(int signum, sighandler_t handler);

参数:

signum:要操作的信号

handler:对应信号处理方式

SIG_IGN  //忽略处理

signal(2,SIG_IGN);

SIG_DFL  //默认处理,即交给内核

函数名 //自定义处理

返回值: 成功返回处理函数指针,失败返回SIG_ERR。

Linux系统编程阶段:管道和信号相关知识及部分函数介绍。相关推荐

  1. Linux系统编程(四)信号

    Linux系统编程(四)信号 一.什么是信号? 1.信号的本质 2.信号来源 硬件来源 软件来源 二.常见信号 1.可靠信号和不可靠信号 2.不可靠信号主要有以下问题: 3.可靠信号与不可靠信号注册机 ...

  2. linux有名管道数据异常,Linux系统编程—有名管道

    ▋****1. 管道的概念 管道,又名「无名管理」,或「匿名管道」,管道是一种非常基本,也是使用非常频繁的IPC方式. 1.1 管道本质 管道的本质也是一种文件,不过是伪文件,实际上是一块内核缓冲区, ...

  3. linux 可定义信号数,Linux系统编程(20)——信号基本概念

    信号及信号来源 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知 ...

  4. Linux系统编程- 无名管道(匿名管道)

    无名管道作为Linux进程间通讯,我们这里把理论和实际结合起来说明. 1.什么是管道 管道,英文位pipe,在学习linux系统编程一个重要概念.它的发明人是道格拉斯.麦克罗伊,这位也是UNIX上早期 ...

  5. Linux系统编程31:进程信号之什么是信号的阻塞及相关术语(递达,未决,pending位图,handler位图)

    文章目录 (1)信号相关术语 (2)信号在内核中的表示 前面说过,操作系统发出信号之后,对于进程有可能不是立马就处理的,所以如果不是立即处理,那么在这个空档期间进程究竟对信号做了怎样的处理呢? (1) ...

  6. linux系统编程(九) 信号

    文章目录 1.信号 1.1 信号的概念 1.1.1 信号的机制 1.1.2 与信号相关的事件和状态 1.1.3 信号的编号 1.1.4 信号4要素 1.1.5 Linux常规信号一览表 1.2 信号的 ...

  7. 【linux系统编程】进程间通信:信号中断处理

    什么是信号? 信号是 Linux 进程间通信的最古老的方式.信号是软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信的方式 .信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断, ...

  8. Linux系统编程30:进程信号之产生信号的四种方式(Core Dump,kill,raise)

    文章目录 (1)通过按键产生信号-Core Dump (2)调用系统函数向进程发送信号 A:kill B:raise C:abort (3)由软件条件产生信号 (4)硬件异常产生信号 总结: 为了方便 ...

  9. 进程返回linux系统编程之管道(二):管道读写规则和Pipe Capacity、PIPE_BUF

    题记:写这篇博客要主是加深自己对进程返回的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. 一. 当没有数据可读时 O_NONBLOCK disable:read调用阻塞,即进程暂停 ...

最新文章

  1. 为什么说Transformer就是图神经网络?
  2. 深度学习RNN实现股票预测实战(附数据、代码)
  3. 【推荐】Nginx基础知识之————多模块(非覆盖安装、RTMP在线人数实例安装测试)
  4. SAP云平台CloudFoundry上部署了一个应用的技术明细
  5. 做人:失信是最大的破产!
  6. C语言试题二十一之定义n×n的二维数组编写函数 function(int a[][n])功能是:使数组左下半三角元素中的值全部置成0。
  7. Error opening data file Tesseract-OCR\tessdata/eng.traineddata问题解决
  8. 基础学习笔记之opencv(5):实现鼠标选定矩形框
  9. python retry retrying使用
  10. java 整型list_Java:集合,对列表(List)中的数据(整型、字符串、日期等)进行排序(正序、倒序)的方法;字符串按照整型排序的方法...
  11. 如何一站式高效管理固定资产?
  12. 你需要知道的物联网开放平台
  13. Winform面试题
  14. 【收藏】40 个学术网站,满足科研文献需求!
  15. 1linux 课程引入
  16. Unity_混合树实现三种动画的混合_070
  17. 技术领导力:作为技术团队领导经常为人所忽略的技能和职责
  18. Table ... doesn‘t exist
  19. 预装Win 8.1 Pro环境下安装Win 7双系统
  20. 锐捷SNMP配置实例

热门文章

  1. 券商的软件交易速度一般有多快?
  2. matlab画出积分波形,基于MATLAB的卷积积分 计算卷积的通用函数
  3. 五月的仓颉 聊聊我成长了什么
  4. eclipse设置黑色背景
  5. java如何获得组合框并运用,Swing如何使用组合框?
  6. 一分钟了解阿里云产品:云监控
  7. Win7网络无法连接时要怎么做
  8. 趋势跟踪交易方法盈利的根本是什么?
  9. 基于百度地图的电子围栏设置工具
  10. Android实践--如何提高Android模拟器的运行速度