笔记系列
嵌入式系统方向学习笔记8
嵌入式系统方向学习笔记9
嵌入式系统方向学习笔记10
嵌入式系统方向学习笔记11
进程通信
一、进程间通信(IPC)
进程间通信(IPC)方式
管道:有名管道和无名管道
消息队列
信号量
共享内存
套接字
进程间通信的目的:
1. 数据传输:几M字节
2. 共享数据:多个进程立刻看到数据保证实时性
3. 通知事件:一个进程向其他进程发送消息通知发生了某种事件(如如进程终止时通知父进程)
4. 资源共享:多个进程之间共享同样的资源。(需要内核提供锁和同步机制)
5. 进程控制
二、管道通信
1.无名管道
无名管道:一端写,一端读
管道是半双工,数据只能向同一个方向流动,需要双方通信时
Int pipe(),
0是读 1是写
必须在系统调用fork前调用pipe,否则子进程不会继承文件描述符
1. 如果管道的写端不存在,则认为已经读到了数据末尾,该函数返回的读出字节数为0
2. 当管道写端不存在,如果请求的字节数目大于PIPE_BUF(一个宏),则返回现有的数据字节数;如果不大于,则返回现有数据字节数或请求字节数
2.有名管道
mkfifo()
mode:O_WRONLY|O_RDONLY
3.管道通信总结
- 传输数据少,因此只适合小数据量的传输
- 管道数据被读出时会自动删除
- 管道数据输出格式?
三、信号
软中断(程序间传输信息的媒介)
查看信号 kill -l
Ctrl z:终止信息
Ctrl c:暂停信息
Int kill (pid_t pid,int sig);
信号处理
Sighhandler_t signal(int signnum, sighandler_t)
---------------------------- 信号编号,信号处理机制
SIG_IGN(忽略信号)
SIG_DFL(信号直接处理)
四、共享内存
无格式
当数据量大且读写效率要求较高的时候使用(读写效率高减少了进出内核的次数)
内核的实现原理:
在内存中开辟一块内存可以让多个进程共享
如果一个进程对于共享内存的内容进行了更改,其他进程都会受到影响
一个共享内存的最大容量:shnmax
posix: 系统v
开辟共享内存
Int shmget(key_t key, size_t size,int shmflg)
共享内容键值:0
IPC_PRIVATE:创建一块新的共享内存
返回值shmid:共享内存的标识符
shmflg:IPC_CREAT
映射共享内存:
shmat: void *shmat(int shmid, const void *shmaddr, int shmflg);
决定以什么方式来确定映射的地址,一般为0
过程:
1. 进程调用shmget函数创建新的或获取已有的共享内存
2. 调用shmat函数将物理内存映射到自己的进程空间
3. 调用shmdt函数取消映射
4. 调用shmtl函数释放开辟的物理空间
五、消息队列
传递有格式的消息流
多进程网状交叉通信,实现大规模数据通信
使用内核中的链表(实现机制)
消息队列是随内核持续的