内核提供的原始通信方式有三种
管道通信:
1> 在内核空间创建一个特殊的文件,管道文件,一个进程可以将数据写入管道,另一个进程从管道中读取数据
2> 管道文件是特殊的文件,不用于存储数据,仅仅只是用来完成进程间数据的交流
3> 管道文件的操作是一次性的,当从管道中将写入的文件读取出来后,该消息就不存在了
4> 每个管道都有一个缓冲区,该缓冲区对应两个文件描述符,分别对应该管道的读端和写端
5> 管道通信属于一种半双工通信方式
6> 管道文件的大小:64K(65536字节)
1、无名管道
1> 无名管道不能使用open函数来打开,需要使用特殊的api进行打开
2> 无名管道的api :int pipe(int pipefd[2]);
3> 无名管道只能适用于亲缘进程间的通信
2、有名管道
1> 对管道文件的操作,可以使用open函数进行打开,所以,有名管道既可以用于亲缘进程间通信,也可以用于非亲缘进程间通信
2> 有名管道的api:int mkfifo(const char *pathname, mode_t mode);
3、信号
1> 信号是软件模拟底层硬件的中断操作,中断:打断当前正在进行的事情,去做另一件事
2> 信号是软件实现的,中断是硬件实现的
3> 信号是linux内核实现的,没有linux,就没有信号的概念
4> 用户可以给某个进程发送信号,一个进程也能给另一个进程发送信号,内核也可以给某个进程发送信号
5> 当一个进程收到信号后的操作有三种:默认(一般是杀死进程)、捕获、忽略,有两个信号既不能被捕获,也不能被忽略(SIGKILL、SIGSTOP)
System V提供了三种通信方式
4、消息队列
消息队列是一种存放在内核中的消息链表,允许不同进程之间通过发送和接收消息进行通信。
5、共享内存
1>共享内存是一种通过将一块内存空间映射到多个进程的地址空间来实现进程间通信的方式
2> 共享内存的操作不是一次性的,当共享内存段中的数据被读取后,依然存在
3> 共享内存是所有进程间通信方式中效率最高的,原因是,操作共享内存段时,无需进行用户空间和内核空间的切换
6、信号量(信号灯集)
信号量是一种记录型变量,用于控制对共享资源的访问。
7、套接字通信:socket
1>套接字是网络通信使用的介质,也是一种特殊的文件
2>socket也是一个函数,内核提供的函数,用于创建一个套接字,并返回当前套接字的文件描述符
3> 套接字是一种在网络上进行通信的方式,用于不同主机之间的进程间通信。
优点如下:
无名管道:简单、占用资源少、可靠性高。
有名管道:可在无亲缘关系的进程间通信、提供双向通信能力。
信号:可以给进程发送信号。
消息队列:能够处理复杂的通信模式、提供可变长度的消息。
共享内存:速度快、可用于大量数据的高效传输。
信号量:能够实现同步和互斥、可用于进程同步。
套接字:可用于不同主机间通信、提供可靠的双向通信。