plugin机制
protobuf是一个支持plugin机制的序列化框架,除了protobuf自带的几种语言的CodeGenerator,用户可以按需实现自己的插件,来实现语言的拓展(比如protoc-gen-lua)或者功能的拓展(厂子内部的mcpack2pb插件)。
因为protoc插件需要实现跨平台、跨语言,所以采用的方式是父子进程的工作方式,父子进程通过pipe(父子进程共享fd)方式通信,父子进程通信数据的格式定义在compiler/plugin.proto。
- 父进程(protoc进程)中负责读取proto文件,转化为CodeGeneratorRequest格式,启动子进程,以及后续持久化子进程返回内容;
- 子进程(自定义插件进程)完成中子进程中启动自定义的CodeGeneratorResponse格式,按照自己需要完成处理,返回给父进程(protoc进程);
父子进程共享fd工作机制说明:
利用父子进程共享fd机制,建立pipe(单工模式)。
- 子进程一侧,做重定向,将
stdin_pipe[0]
重定向到STDIN_FILENO
,stdout_pipe[1]
重定向到STDOUT_FILENO