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)!