1.linux 进程间通信方式主要有6中:
1.管道,有名管道:管道用于具有亲缘关系进程间的通信,又名管道则还允许无亲缘关系进程间的通信。
2.信号,
3.消息队列
4.共享内存
5.信号量,:作为进程间或者同一进程的线程间的同步和互斥。
6.socket
1.管道
管道:把一个程序的输出直接连接到另一个程序的输入。
1.1 无名管道
a,亲缘进程间,半双工,存在内核中
b,当一个管道建立适合,他会创建两个文件描述符 fds[0](读管道),fds[1](写管道),管道关闭时,依次close即可
c.
// 管道创建
int pipe (int fd[2]);
一般的,pipe 实在一个进程中创建的,因此,可以在fork一个子进程,pipe 两个fd就被继承了,然后close一方的读,另一方的写,就产生了一个通道,无名管道都是在内核中的,这个数据写了,另外一方不读,就会阻塞住。
1.2 有名管道FIFO
int mkfifo(const char * filename ,mode_t mode)
管道创建成功皇后,可以使用open,read,write
2.信号
软件层次上对中断机制的模拟。原理上,一个进程收到一个信号和处理器接受到中断请求是一样的。
信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以用信号来通知用户空间进程。
来源:硬件来源和软件来源
软件来源(kill,raise,alarm,settimer sigqueue)
响应信号一般(忽略,扑捉,执行默认操作)
3.信号量
临界资源:
硬件资源,处理器内存,存储器以及外围设备
软件资源,共享代码段,共享结构,变量
1.使用semget函数创建或者获取已存在的信号量
2.初始化信号量
3.pv操作,semop
4.删除 semctl
4.共享内存
1.最为有效的进程间通讯方式,内核专门留出一块内存,该段内存区域由要访问的进程映射到自己的私有地址空间,因此无需复制数据,直接读写这段内存。需要依靠同步机制。
1.创建共享内存 shmget
2.映射共享呢村 shmat
3.撤销映射 shmdt
5.消息队列
具有FIFO特性
1.创建或者打开 msgget
2.msgsnd
3.msgrcv
4.msgctl