Linux进程间通信方式
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进程间通信方式相关推荐
- dat关闭某进程_超详细解析!工程师必会的Linux进程间通信方式和原理
▍进程的概念 · 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放.可以认为进程是一个程序的一次执行过程. ▍进程通信的概念 · 进 ...
- [【转载】 linux进程间通信方式
目录 目录 进程通信的目的 Linux 进程间通信(IPC)的发展 linux使用的进程间通信方式 管道( pipe ) 信号量( semophore ) 消息队列( message queue ) ...
- linux 进程间通信方式
1. 用户态和内核态进程通信 1)系统调用,最常用, 比如针对IO,有linux同步io接口(libaio最终也是调用linux同步io系统接口),linux aio ,linux io_uring ...
- linux进程间通信方式及比较
进程间的通信方式: 1.管道(pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信. 2.信号(sig ...
- <Linux进程间通信方式-详细总结>
文章目录 1.进程间通信(IPC) 2.进程间通信方式一:管道 2.进程间通信方式二:共享内存 3.进程间通信方式三:消息队列 4.进程间通信方式四:信号量 1.进程间通信(IPC) 1.进程间通信方 ...
- Linux进程间通信方式--本地socket
先上一个代码 服务端: [cpp] view plaincopy //s_unix.c #include <stdio.h> #include <sys/types.h> #i ...
- Linux进程间通信(五)——进程间通信
一.进程间通信简介 Linux的进程通信方式基本上是从Unix平台上的进程通信方式继承而来的.在Unix发展过程中,贝尔实验室和BSD(加州大学伯克利分校的伯克利软件发布中心)是Unix发展的主要贡献 ...
- 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 ...
- 进程间通信方式有哪些-Linux进程间通信
进程间通信:(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息: 进程间的通信方式: 管道(包括无名管道和命名管道).消息队列.信号量.共享内存.套接口. ...
最新文章
- SAP RETAIL 如何查看分配表是参考哪个PO来创建的?
- 计算机使用DHCP动态分配参数,某单位采用DHCP进行IP地址自动分配,用户收到()消息后方可使用其中分配的IP - 信管网...
- 螺钉装弹垫平垫机器人_一种批量组装螺钉、弹垫、平垫的工装及使用方法_2
- 统计学习方法第十四章作业:聚类—层次聚类聚合/分裂算法、K_means聚类算法 代码实现
- 【spring-session】 1.x与2.x 不兼容
- deepin linux桌面设置,在Deepin Linux桌面创建快捷方式
- python模拟输入回车键_用Python模拟键盘输入
- Git笔记(1) 版本控制
- postgresql9.5.9相关的日志文件介绍
- Java线程专栏文章汇总(转)
- 2016年第四季度思科称霸印度网络市场
- 《计算机网络:自顶向下方法》阅读笔记
- 那些年我们踩过的坑——Java中Date夏令时日期转换不一致问题
- 正确开启用户实体行为分析(UEBA)番外篇:SIEM与UEBA
- 2017北大数学夏令营第一天第二题的解答
- linux中ln -s 命令详解
- Gym - 102263 B - Road to Arabella
- c语言怎么做步骤循环,C语言基础教程之循环
- 一招解决Android 加载高清大图
- 创客机器人的课程简单易学吗
热门文章
- Arduino框架下STM32F1/F4系列HID模式程序烧录教程
- 【源码】核磁共振成像的脑部肿瘤检测与分类
- 计算机专业白色简历封面,计算机专业个人简历封面模板图
- 2018ei期刊目录计算机,科学网—2018年智能计算与信息系统国际会议(ICIS2018)征文期刊EI检索 - 周建国的博文...
- JavaScript-筑基(二十五)navigator对象(判断页面打开终端)、history对象
- 《springboot和mybatis项目使用枚举转换器出现No enum constant及解决方法》
- html名人名言页面,网页制作:关于生命的名言警句 ― 名人名言 一品故事网,Www.07938.Come...
- b460m迫击炮黑苹果_黑苹果系列2 - 我的黑苹果配置
- TVP周年庆:“用科技影响世界”,一起出发!
- 字节跳动测开面经(两面 + HR)