Mediasoup Demo-v3笔记(六)——Mediasoup 进程间的通信

  我们知道,在mediasoup库中,有js和c++的两个进程,在顶层的mediasoup-demo中会创建多个Worker来创建对个进程,所以就会出现一个js进程对应多个c++子进程的情况,那这些进程中间是如何通信的呢?

常见的进程间通信的方式

Mediasoup Demo-v3笔记(六)——Mediasoup 进程间的通信_第1张图片

父子进程间通过匿名管道的通信原理

Mediasoup Demo-v3笔记(六)——Mediasoup 进程间的通信_第2张图片
fork子进程后,子进程会拷贝父进程的管道
Mediasoup Demo-v3笔记(六)——Mediasoup 进程间的通信_第3张图片
为了避免混乱,就会让父进程写,子进程读数据
Mediasoup Demo-v3笔记(六)——Mediasoup 进程间的通信_第4张图片

用socketpair来实现进程间的通信

在用unixsocket进行进程通信的时候,父进程创建的通信空间是一样的,但是在fork后的socketpair的通信机制有所不同:简单来说,就是每一个文件描述符既可以读数据,也可以写数据
Mediasoup Demo-v3笔记(六)——Mediasoup 进程间的通信_第5张图片
但是上面的情况就会出现混乱的情况,真实的情况中,我们也是会在父进程和子进程中关闭一个文件描述符,这样就能达到全双工的读写方式
Mediasoup Demo-v3笔记(六)——Mediasoup 进程间的通信_第6张图片
在mediasoup中,是通过libuv封装的socketpair的方式来实现的进程间的通信

用socketpair进行进程间通信的示例

我们在centos上创建一个c文件:

vim testsocketpair.c

其内容如下:

#include
#include
#include


int main(int argc, char* argv[]) {
	int sv[2];
	if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv)< 0) {
		perror("socketpair:");
		return -1;
	}
	pid_t id = fork();
	if (id == 0) {
		char* msg = "I'm children\n";
		char buffer[1024] = { 0, };
		close(sv[1]);
		while (1) {
			write(sv[0], msg, strlen(msg));
			sleep(1);
			ssize_t len = read(sv[0], buffer, sizeof(buffer));
			if (len > 0) {
				buffer[len] = '\0';
				printf("children,recv from parent: %s \n", buffer);
			}
		}
	}
	else if (id > 0) {
		char* msg = "I'm father\n";
		char buffer[1024] = { 0, };
		close(sv[0]);
		while (1) {
			ssize_t len = read(sv[1], buffer, sizeof(buffer));
			if (len > 0){
				buffer[len] = '\0';
				printf("father,recv from children: %s \n", buffer);
				sleep(1);
			}
			write(sv[1], msg, strlen(msg));
		}
	}else {
		perror("failed to create process\n");
		
	}
	return 0;

}

用下面命令进行编译,如果没有clang命令,可以用yum install -y clang安装

clang -g -o testsocketpair testsocketpair.c

执行编译成的文件,结果如下:
Mediasoup Demo-v3笔记(六)——Mediasoup 进程间的通信_第7张图片


后记
  个人总结,欢迎转载、评论、批评指正

你可能感兴趣的:(音视频,#,Mediasoup,v3,笔记)