文章目录
- 1 前言
- 2 无名管道
- 3 有名管道
- 4 管道读写特点
- 5 设置管道为非阻塞
- 6 使用有名管道实现简单版本聊天
- 7 共享存储映射
- 7.1 mmap 存储映射函数
- 7.2 共享映射实现父子进程通信
- 7.3 共享映射实现无亲缘关系进程通信
- 7.4 匿名映射实现父子进程通信
- 8 信号
- 8.1 概念和特点
- 8.2 信号的编号
- 8.3 信号的四要素
- 8.4 信号的状态 阻塞信号集和未决信号集
- 8.5 信号产生函数
- KILL
- raise
- 8.6 信号捕捉 signal(避免使用)
- 8.7 信号集和信号集操作函数 PCB
- 8.8 sigprocmask 函数
- 8.9 获取未决信号集
- 8.10 信号处理方式
- 8.11 信号捕捉 sigaction
- 8.12 sigqueue
- 8.13 不可重入,可重入函数
- 8.14 使用信号避免僵尸进程
1 前言
进程是独立的资源分配单元,不同进程之间的资源是独立的,不能直接在一个进程中直接访问另一个进程的资源。
主要通信机制
2 无名管道
无名管道的创建 pipe函数,fd[0]用于读fd[1]用于写
父子进程通过无名管道通信
管道是阻塞的,如果是子进程先执行,则会阻塞
3 有名管道
有名字,可以在无亲缘关系的进程间通信。
创建管道(通过命令)
创建管道(通过函数 mkfifo)
有名管道的读写
测试
4 管道读写特点
四种情况:
1.写端没关闭,管道中没有数据,这时候都管道进程读管道,会发生阻塞。
如果写端没有关闭,管道中有数据,读管道会将数据读出,下次读没有数据就会阻塞。
2. 所有写端关闭,读进程读管道内容,读取全部内容,最后返回0
3. 所有读端没有关闭,管道写满了,写管道进程写管道会被阻塞。
4. 所有的读端被关闭,写管道进程写管道会收到一个信号,然后退出。
5.
看管道大小
ulimit -a
查看管道缓冲区函数
设置管道为非阻塞
5 设置管道为非阻塞
6 使用有名管道实现简单版本聊天
使用两个管道
另一个talker把读写管道交换一下
可以使用多进程,子进程读,父进程写。
7 共享存储映射
7.1 mmap 存储映射函数
注意事项
7.2 共享映射实现父子进程通信
7.3 共享映射实现无亲缘关系进程通信
读
7.4 匿名映射实现父子进程通信
8 信号
8.1 概念和特点
中断:某一个信号产生时,处理信号时,对原来处理的事情进行暂停,并执行信号相应的函数,执行后再即系进行原来处理的事情
是一个异步的事情
信号可以直接进行用户控件进程和内核空间进程的交互,内核进程可以利用信号通知用户进程发生了什么系统事件。
8.2 信号的编号
8.3 信号的四要素
1)编号 2)名称 3)事件 4)默认处理动作
在 man 7 signal中查看
8.4 信号的状态 阻塞信号集和未决信号集
8.5 信号产生函数
KILL
raise
8.6 信号捕捉 signal(避免使用)
函数指针
sighandler_t 就是返回值为void ,参数为int的函数
返回函数指针,第一个信号,第二个函数指针变量(回调函数,void返回值,int为参数)
避免使用这个,应该使用sigaction
捕捉定时器,使用signal
8.7 信号集和信号集操作函数 PCB
未决信号集,阻塞信号集
未决信号集不能设置,只能读。阻塞信号集可以设置。
8.8 sigprocmask 函数
信号阻塞集
8.9 获取未决信号集
8.10 信号处理方式
8.11 信号捕捉 sigaction
新的
8.12 sigqueue
8.13 不可重入,可重入函数
信号处理函数应该是可重入函数
8.14 使用信号避免僵尸进程