解码器在使用过程中,开机容易出现 ztebw 向 vplayer 发送控制命令失败,时常返回 Resource temporarily unavailable 错误,导致一些关键的命令没有办法发送成功,造成字幕叠加不正确或者播放不成功,给使用带来一些不便。在解码器中, ztebw 和 vplayer 分别以进程形式存在,使用高效的 Unix Domain Socket 通信,用非阻塞模式。由于解码器同时支持 8 路视频点播,每一路视频播放都通过同一 Unix Domain Socket 发送,造成网络阻塞发送不成功,也不是没有有可能的。那原因究竟在哪呢?
先看看 Unix Domain Socket 这种 Socket 。按照网上的说法, UNIX Domain Socket 用于 IPC 更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。而且 UNIX Domain Socket 是全双工的, API 接口语义丰富,相比其它 IPC 机制有明显的优越性,目前已成为使用最广泛的 IPC 机制,比如 X Window 服务器和 GUI 程序之间就是通过 UNIX Domain Socket 通讯的。
有了这样的高帽,我们只能先把焦点放在应用上了。仔细分析启动过程中的消息发送过程。发现
这个过程本身是没有错的,但是解码器考虑到 vplayer 可能会中途退出重启,会主动通知 ztebw 进程,告诉 ztebw 自己已经启动了,会不断发送