概述
目录
前言
匿名管道进程间通信
进程间管道 的创建与图解
MediaSoup中的管道创建
MediaSoup Channel的创建
NodeJs和 C++ 管道通信的过程
MediaSoup 消息确认与事件通知
小结
前言
上篇文章对MediaSoup源码的调试方法 以及运行时分析、调试、查看核心信息 【流媒体服务器Mediasoup】 源码中重要类基本概念 、上层代码作用详解、底层C++类关系详解(四),本章节主要对MediaSoup的源码中源码中NodeJs与C++信令通信详解,以及讲解在Linux下管道通信的使用
在下一篇文章中将继续对MediaSoup的源码进行分析和架构的讲解。
匿名管道进程间通信
Linux下常见的进程间通讯方式(IPC)
1:管道:匿名管道,有名管道
匿名管道需要有关联如父子进程时间的联系
2:Socket:unixsocket,普通的socket
3:共享内存
4:信号 (kill命令)
管道的原理: 管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。
对管道的具体概念不进行详解,如需可以参考网上资料。
进程间管道 的创建与图解
前三个是固定的特殊的管道,标准输入,标准输出,标准错误,最后两个由两个文件描述符引用,一个表示读端,一个表示 写端。
对于fd[0]=3 或者4来说 既可以读也可以写为全双工通信。fd[0]=4 写入的数据需要 fd[0]=3 来读取,反之fd[0]=3 写入的数据需要fd[0]= 4 来读取 ,这是只有一个进程的情况下创建的socketpair。但fork了子进程后,子进程的fd[0]=3和fd[0]=4 一样指向了 读和写管道,这样很容易造成混乱。
那么父进程fork子进程后,显然 如果同时写和读会造成混乱,下图改进方案为
父进程发送信息给子进程,则就父写子读,就形成半双工的父进程到子进程的通信
Mediasoup底层使用的是Unixsocket全双工进程间通讯.那么要想实现全双工, 修改后的方案如下
最后实现的原理:
父进程关掉3,子进程关闭掉4,父进程用4去接收或者发送管道,子进程用3去接收或者发送管道
代码实战
代码中给出了明显的注释,阅读后来看下最后运行的结果
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
const char* str = "SOCKET PAIR TEST.";
int main(int argc, char* argv[]){
int socket_pair[2];
pid_t id;
//创建socketpair
if(socketpair(AF_UNIX, SOCK_STREAM, 0, socket_pair) == -1){
printf("Error, socketpair create failed, errno(%d): %sn", errno, strerror(errno));
return EXIT_FAILURE;
}
//创建子进程
id =fork();
if(id == 0){
//子进程
char buffer[512]={0, };
//子进程关闭管道4
close(socket_pair[1]);
while(1){
//发送数据给父进程
printf("childer send n");
write(socket_pair[0], str , strlen(str));
sleep(1);
//接收父进程数据
ssize_t len = read(socket_pair[0], buffer, sizeof(buffer));
if(len > 0 ){
buffer[len] = '