- 进程间通信方式:管道、信号、消息队列、共享内存、信号量、套接字
- 无名管道:a、只能用于具有亲缘关系的进程之间;b、是半双工的通信模式;c、可视为特殊的文件,并不属于任何文件系统,并且只存在于内核的内存空间
- 管道只能在具有亲缘关系的进程间通信的原因:通过管道通信的基本原理本身就是子进程继承父进程的管道文件描述符才得以和管道通信的,故只能在具有亲缘关系的进程间通信。
- 管道的文件描述符为fd[];其中fd[0]为读端、fd[1]为写端
- 只有在管道的读端存在时,向管道写入数据才有效。
- 向管道写数据时以阻塞的方式写入
- 使用管道时父子进程需要通过同步与互斥机制保证运行先后顺序
- 有名管道:突破了亲缘进程间通信的限制;对有名管道的定位无法使用lseek();操作;对该管道的读总是从开始处返回数据,对它们的写则把数据添加到末尾。
- 创建有名管道需要使用mkfifo();操作是使用open();等文件操作函数
- 信号是在软件层面对中断机制的一种软件模拟,是一种异步通信方式
- 信号可以直接在用户空间进程和内核空间进程之间进行交互
- 信号的生命周期:信号产生、信号在进程中的注册与注销、执行信号处理函数
- 用户进程对信号的处理方式:忽略信号(SIGKILL、SIGSTOP不可忽略)、捕捉信号、执行默认操作
- 发送信号的函数有kill();、raise();、alarm();、pause();
- SIGKILL :该信号用于立即停止一个进程,且不能够被忽略、阻塞或处理
- SIGSTOP :该信号用于暂停一个进程,且不能够被忽略、阻塞或处理
- waitpid();不仅可以用于回收子进程;还可以用于得到子进程得到的信号状态
- signal();主要用于前32种非实时信号的处理。不支持信号传递信息。(推荐使用linux更健壮、更新的信号处理函数sigaction();)
- SIGKILL和SIGSTOP不能被catch和ignore
- signal();的作用:捕捉信号并作相应处理;
- 信号进入待处理状态时进程并不清楚信号的存在,在信号集合退出阻塞集合时,未处理信号被进程作相应的处理
- 信号量的生命周期:创建信号量或获得系统已存在的信号量(使用函数semget();)、初始化信号量(使用函数semctl();)、进行信号量的PV操作(使用semop();函数)、从系统中删除信号量(semctl();的IPC_RMID)
- 进程间通信方式中最高效的方式为:共享内存
- 共享内存的实现过程:a、创建共享内存(使用的函数为shmget();目的是从内存中获得一段共享的内存区)、b、映射共享内存(使用函数shmat();将具体的共享内存映射到相应的进程空间中)c、使用共享内存段;
- 消息队列的使用步骤包括:a、创建或打开消息队列;b、添加消息;c、读取消息和控制消息队列
- 消息队列中的信息是存在于内核中的,又队列ID来标识。
- 27.
单词查询:
- modifiable:可改变的
- describe : 描述
- via : 经过
- absolute value:绝对值
- immediately:马上
- trace : 沿着
- provide:提供
- patch:修补
- delivery:传递
- integer : 整数
- inspect :检查
- consist:由..组成
- demonstrate:示例
- pause:暂停
- monitor:监听
- failure:失败
- convert:转换
- terminate:终止
- macro:宏
- disposition 处理
- associate :联系
- invocation:引用
- catch:捕捉
- initialize:初始化
- identity:一致
int atoi(const char *nptr);/*convert a string to integer*/
函数区别:
raise(); and pause();
raise();是进程给自身发一个signal(存在于signal.h)
pause();是用于将调用进程挂起直至捕捉到信号为止;(存在于unistd.h)