当前位置: 首页 > Linux

zsh开发指南(第17部分使用socket文件和TCP实现进程间通信)

时间:2023-04-06 04:22:05 Linux

介绍前面提到过,zsh脚本可以直接使用socket文件(UNIX域套接字使用)或TCP与其他进程通信。如果进程都是本地的,使用socket文件效率更高,而且不占用端口,权限也更好控制。如果在不同的机器上,可以使用TCP。套接字文件UNIX域套接字是一种比管道更高级的进程通信方法。全双工方式,稳定性更好。但是性能比pipeline差,但是一般性能瓶颈不会出现在这里,所以不用考虑性能问题。而且,可以在一个socket文件上建立多个连接,更易于管理。另外,如果通信方式从socket文件改为TCP,只需要修改几处代码(建立和关闭连接的代码略有改动),但是从管道改为TCP就麻烦多了。因此,建议如果使用zsh编写进程交互脚本,直接使用socket文件,不要使用命名管道(匿名管道能满足要求的简单场景忽略)。Socket文件的用法:#监听连接结束#首先要加载socket模块%zmodloadzsh/net/socket%zsocket-ltest.sock%listenfd=$REPLY#这里阻塞等待连接%zsocket-a$listenfd#连接建立%fd=$REPLY%echo$fd5#然后$fd可读写%cat<&$fdgood#发起连接end#首先加载socket模块%zmodloadzsh/net/socket%zsockettest.sock#连接建立%fd=$REPLY%echo$fd4#那么$fd就可以读写了%echogood>&$fd连接建立之后,怎么用就自由了。实际使用中判断fd是否正常建立连接。通常在网络环境下使用socket文件比使用TCP稳定很多,一般不会出现连接中断等异常情况。另外可以在zsocket后面加上-v参数,查看详细信息(比如使用的fd号)。关闭连接:#发起连接end#fd是之前存放fd号的变量,不用加$%exec{fd}>&-#监听连接end%exec{listenfd}>&-%exec{fd}>&-#把socket文件删掉,下次用到就重新创建。该文件不能重复使用。%rmtest.sockTCP使用TCP连接的方法与使用socket文件基本相同。#监听连接结束#首先加载tcp模块%zmodloadzsh/net/tcp%ztcp-l1234%listenfd=$REPLY#这里阻塞等待连接%ztcp-a$listenfd#连接建立%fd=$REPLY%echo$fd3#然后$fd可读写%cat<&$fdgood#发起连接end#首先加载tcp模块%zmodloadzsh/net/tcp%ztcp127.0.0.11234#连接建立%fd=$REPLY%echo$fd3#然后$fd可读可写%echogood>&$fd关闭连接:#发起连接end#fd是之前存储fd号的变量%ztcp-c$fd#Monitor连接结束%ztcp-c$listenfd%ztcp-c$fdprogramsamplerecv_tcp,监听指定端口,输出发送的消息。用法:recv_tcpport#!/bin/zshzmodloadzsh/net/tcp(($+1))||{echo"Usage:${0:t}port"exit1}ztcp-l$1listenfd=$REPLY[[$listenfd==<->]]||exit1while((1)){ztcp-a$listenfdfd=$REPLY[[$fd==<->]]||continuecat<&$fdztcp-c$fd}send_tcp,用于向指定机器的指定端口发送消息。使用方法:send_tcpmachinenameportmessage(机器名可选,没有则发送到本机,消息可以包含空格)#!/bin/zshzmodloadzsh/net/tcp(($#>=2))||{echo"Usage:${0:t}[hostname]portmessage"exit1}if[[$1==<0-65535>]]{ztcp127.0.0.1$1}else{ztcp$1$2shift}fd=$回复[["$fd"==<->]]||exit1echo${*[2,-1]}>&$fdztcp-c$fd它们之间通信的总结方法。本文不再更新,全系列文章更新维护在这里:github.com/goreliu/zshguideWindows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua等相关问题的付费解决方案,定价灵活,欢迎咨询,微信ly50247。