1. 管道:简单

实现原理: 操作系统的内核借助环形队列机制,使用内核缓冲区实现。特质: 1. 伪文件2. 管道中的数据只能一次读取。3. 数据在管道中,只能单向流动。局限性:1. 自己写,不能自己读。2. 数据不可以反复读。3. 半双工通信。4. 血缘关系进程间可用。pipe函数:   创建,并打开管道。

函数用法:

int pipe(int fd[2]);参数:fd[0]: 读端fd[1]: 写端。
一个管道通信的示例,父进程往管道里写,子进程从管道读,然后打印读取的内容:
1.  #include <stdio.h>
2.  #include <stdlib.h>
3.  #include <string.h>
4.  #include <unistd.h>
5.  #include <errno.h>
6.  #include <pthread.h>
7.
8.  void sys_err(const char *str)
9.  {
10.     perror(str);
11.     exit(1);
12. }
13.
14. int main(int argc, char *argv[])
15. {
16.     int ret;
17.     int fd[2];
18.     pid_t pid;
19.
20.     char *str = "hello pipe\n";
21.     char buf[1024];
22.
23.     ret = pipe(fd);
24.     if (ret == -1)
25.         sys_err("pipe error");
26.
27.     pid = fork();
28.     if (pid > 0) {
29.         close(fd[0]);       // 关闭读段
30.         //sleep(3);
31.         write(fd[1], str, strlen(str));
32.         close(fd[1]);
33.     } else if (pid == 0) {
34.         close(fd[1]);       // 子进程关闭写段
35.         ret = read(fd[0], buf, sizeof(buf));
36.         printf("child read ret = %d\n", ret);
37.         write(STDOUT_FILENO, buf, ret);
38.
39.         close(fd[0]);
40.     }
41.
42.     return 0;
43. }  

2. 命名管道FIFO

管道的优劣:优点:1. 相比信号、套接字实现进程通信要简单很多2. 可用于无血缘关系的进程间通信缺点:1.只能单向通信,双向通信需建立两个管道2.只能用于有血缘关系的进程间通信。该问题后来使用fifo命名管道解决。

命名管道函数:mkfifo

 读端,open fifo O_RDONLY写端,open fifo O_WRONLY

一个写fifo,一个读fifo,操作起来就像文件一样


2. 信号:开销小

  • 信号是软件层面上的“中断”。一旦信号产生,无论程序执行到什么位置,必须立即停止运行,处理信号。

  • 所有信号的产生及处理全部都是由【内核】完成的。

      产生信号:1. 按键产生:Ctrl+c、Ctrl+z2. 系统调用产生:kill3. 软件条件产生: alarm函数——设置定时器,发送14)SIGALARM信号settime函数4. 硬件异常产生:除0操作、非法访问内存(段错误)5. 命令产生:kill命令signal实现指定的信号捕捉,并设置相关的操作函数handler
    

    概念:

      未决信号:产生与递达之间状态。  递达信号:产生并且送达到进程。直接被内核处理掉。信号处理方式: 执行默认处理动作、忽略、捕捉(自定义)本质是位图的两个信号集阻塞信号集(信号屏蔽字): 记录信号的屏蔽状态。一旦被屏蔽的信号,在解除屏蔽前,一直处于未决态。未决信号集:记录信号的处理状态。该信号集中的信号,表示已经产生,但尚未被处理。
    

3. mmap映射:非血缘关系进程间

存储映射I/O(Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。从缓冲区中取数据,就相当于读文件中的相应字节。与此类似,将数据存入缓冲区,则相应的字节就自动写入文件。
这样就可在不使用read、write函数的情况下,使地址指针完成I/O操作。
减少用户空间到内核空间的传输成本。使用方法:首先通知内核,将一个指定文件映射到存储区域中。
这个映射工作可以通过mmap函数来实现。

mmap函数:

创建共享内存映射
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);       参数:addr:指定映射区的首地址。通常传NULL,表示让系统自动分配length:共享内存映射区的大小。(<= 文件的实际大小)prot:共享内存映射区的读写属性。PROT_READ、PROT_WRITE、PROT_READ|PROT_WRITEflags:标注共享内存的共享属性。MAP_SHARED(修改会反映到磁盘上)、MAP_PRIVATE(修改不反映到磁盘上)fd:用于创建共享内存映射区的那个文件的 文件描述符。offset:默认0,表示映射文件全部。偏移位置。需是 4k 的整数倍。释放映射区。
int munmap(void *addr, size_t length);      addr是mmap函数的返回值

Linux进程间通信方式相关推荐

  1. dat关闭某进程_超详细解析!工程师必会的Linux进程间通信方式和原理

    ▍进程的概念 · 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放.可以认为进程是一个程序的一次执行过程. ▍进程通信的概念 · 进 ...

  2. [【转载】 linux进程间通信方式

    目录 目录 进程通信的目的 Linux 进程间通信(IPC)的发展 linux使用的进程间通信方式 管道( pipe ) 信号量( semophore ) 消息队列( message queue ) ...

  3. linux 进程间通信方式

    1. 用户态和内核态进程通信 1)系统调用,最常用, 比如针对IO,有linux同步io接口(libaio最终也是调用linux同步io系统接口),linux aio ,linux io_uring ...

  4. linux进程间通信方式及比较

    进程间的通信方式: 1.管道(pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信. 2.信号(sig ...

  5. <Linux进程间通信方式-详细总结>

    文章目录 1.进程间通信(IPC) 2.进程间通信方式一:管道 2.进程间通信方式二:共享内存 3.进程间通信方式三:消息队列 4.进程间通信方式四:信号量 1.进程间通信(IPC) 1.进程间通信方 ...

  6. Linux进程间通信方式--本地socket

    先上一个代码 服务端: [cpp] view plaincopy //s_unix.c #include <stdio.h> #include <sys/types.h> #i ...

  7. Linux进程间通信(五)——进程间通信

    一.进程间通信简介 Linux的进程通信方式基本上是从Unix平台上的进程通信方式继承而来的.在Unix发展过程中,贝尔实验室和BSD(加州大学伯克利分校的伯克利软件发布中心)是Unix发展的主要贡献 ...

  8. Linux应用开发【第四章】Linux进程间通信应用开发

    文章目录 4 Linux进程间通信应用开发 4.1 初识进程 4.1.1 进程的概念 4.1.1.1 程序 4.1.1.2 进程 4.1.1.3 进程和程序的联系 4.1.1.4 进程和程序的区别 4 ...

  9. 进程间通信方式有哪些-Linux进程间通信

    进程间通信:(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息: 进程间的通信方式: 管道(包括无名管道和命名管道).消息队列.信号量.共享内存.套接口. ...

最新文章

  1. SAP RETAIL 如何查看分配表是参考哪个PO来创建的?
  2. 计算机使用DHCP动态分配参数,某单位采用DHCP进行IP地址自动分配,用户收到()消息后方可使用其中分配的IP - 信管网...
  3. 螺钉装弹垫平垫机器人_一种批量组装螺钉、弹垫、平垫的工装及使用方法_2
  4. 统计学习方法第十四章作业:聚类—层次聚类聚合/分裂算法、K_means聚类算法 代码实现
  5. 【spring-session】 1.x与2.x 不兼容
  6. deepin linux桌面设置,在Deepin Linux桌面创建快捷方式
  7. python模拟输入回车键_用Python模拟键盘输入
  8. Git笔记(1) 版本控制
  9. postgresql9.5.9相关的日志文件介绍
  10. Java线程专栏文章汇总(转)
  11. 2016年第四季度思科称霸印度网络市场
  12. 《计算机网络:自顶向下方法》阅读笔记
  13. 那些年我们踩过的坑——Java中Date夏令时日期转换不一致问题
  14. 正确开启用户实体行为分析(UEBA)番外篇:SIEM与UEBA
  15. 2017北大数学夏令营第一天第二题的解答
  16. linux中ln -s 命令详解
  17. Gym - 102263 B - Road to Arabella
  18. c语言怎么做步骤循环,C语言基础教程之循环
  19. 一招解决Android 加载高清大图
  20. 创客机器人的课程简单易学吗

热门文章

  1. Arduino框架下STM32F1/F4系列HID模式程序烧录教程
  2. 【源码】核磁共振成像的脑部肿瘤检测与分类
  3. 计算机专业白色简历封面,计算机专业个人简历封面模板图
  4. 2018ei期刊目录计算机,科学网—2018年智能计算与信息系统国际会议(ICIS2018)征文期刊EI检索 - 周建国的博文...
  5. JavaScript-筑基(二十五)navigator对象(判断页面打开终端)、history对象
  6. 《springboot和mybatis项目使用枚举转换器出现No enum constant及解决方法》
  7. html名人名言页面,网页制作:关于生命的名言警句 ― 名人名言  一品故事网,Www.07938.Come...
  8. b460m迫击炮黑苹果_黑苹果系列2 - 我的黑苹果配置
  9. TVP周年庆:“用科技影响世界”,一起出发!
  10. 字节跳动测开面经(两面 + HR)