自学内容网 自学内容网

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

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

常见的进程间通信的方式

在这里插入图片描述

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

在这里插入图片描述
fork子进程后,子进程会拷贝父进程的管道
在这里插入图片描述
为了避免混乱,就会让父进程写,子进程读数据
在这里插入图片描述

用socketpair来实现进程间的通信

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

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

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

vim testsocketpair.c

其内容如下:

#include<stdio.h>
#include<sys/socket.h>
#include<string.h>


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

执行编译成的文件,结果如下:
在这里插入图片描述


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


原文地址:https://blog.csdn.net/u012559967/article/details/135844179

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!