进程间通信
进程间通信机制:
unix继承:管道、信号
system V IPC对象:共享内存、消息队列、信号灯集
套接字
传统的UNIX进程间通信方式包括无名管道、有名管道以及信号。
System V进程间通信(IPC)包括System V消息队列、System V信号量以及System V共享内存。
现在在Linux中使用较多的进程间通信方式主要有以下几种:
1)无名管道 及 有名管道
2)信号
3)共享内存
4)消息队列
5)信号灯集
6)套接字。这是一种使用更广泛的进程间通信机制,它可用于网络中不同主机之间的进程间通信,应用非常广泛。本篇文章主要介绍前五种进程通信方式,套接字将在之后的网络编程中讲到。
1、管道
管道分为 无名管道 和 有名管道,区别在于创建的管道能否在文件系统中是否可见。
1)无名管道
特点:
创建之后在文件系统中不可见
以半双工的方式进行通信
拥有固定的读端和写端
只能用于具有亲缘关系的进程间通信
①无名管道的创建 pipe()
#include <unistd.h> int pipe(int pipefd[2]; 参数: pipefd: 存放无名管道读端 和 写端的数组首地址 pipefd[0]: 读端 pipefd[1]: 写端 返回值: 成功返回 0, 失败返回 -1;
练习: 在一个进程中创建一个子进程,子进程从键盘获取数据,父进程打印输出
② 无名管道的读写特性
读特性:
写端存在:
管道有数据: 返回读到的字节数
管道无数据: 阻塞
写端不存在:
管道有数据: 返回读到的字节数
管道无数据: 返回 0
写特性:
读端存在:
管道有空间: 返回写入的字节数
管道无空间: 阻塞,直到有空间为止
读端不存在:
- 无论管道有无空间,管道破裂
练习: ① 计算无名管道空间大小
②验证管道破裂
2)有名管道 - 创建的管道在文件系统中 可见
- 有名管道创建成功后会在文件系统中以管道文件的形式存在
- 有名管道可以用于任意两个进程间通信,没有固定的读端和写端
① 有名管道的创建 mkfifo()
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
参数:
pathname: 创建管道文件的文件名
mode: 创建管道文件的权限
返回值:
成功返回 0, 失败返回 -1;
练习: 创建一个有名管道,一个进程向管道中输入数据,另一个进程输出数据
2、信号
信号:是中断在软件层次上的一种模拟
信号的处理方式:
默认处理
忽略
捕获信号
1)常用信号
2)信号相关指令
kill -l 查看当前系统中的所有信号
kill -信号编号 -进程号 向指定进程发送对应编号的信号
eg.
kill -9 1123 向进程 1123发送信号9
kill -9 -1123 向进程组 1123发送信号9
kill -9 -1 向除了init进程以外的其他所有进程发送信号9
3)信号相关接口函数
kill() / raise()
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
参数:
pid: 指定进程号
sig: 指定信号
返回值:
成功返回 0,失败返回 -1;
------------------------------