Emacs Lisp中process-send-string报错‘process not running: listen’的求助
问题分析与解决方案
1. 调用process-send-string surfer "asdf"报错的原因
你这里的surfer是服务端的监听进程(通过make-network-process并设置:server t创建的进程),它的状态是listen,仅负责等待客户端发起连接,不具备消息收发能力。只有当客户端成功连接后,服务端会生成一个对应该连接的子进程对象,你需要使用这个子进程来调用process-send-string,而非监听进程本身。
举个服务端实现的示例,通过sentinel回调捕获新连接的客户端进程:
;; 创建服务端监听进程 (setq server-listen-proc (make-network-process :name "rpc-server-listener" :server t :host "localhost" :port 12345 :sentinel (lambda (proc event) (when (string= event "connection established\n") ;; proc即为新连接的客户端进程对象 (message "新客户端连接: %s" proc) ;; 向该客户端发送欢迎消息 (process-send-string proc "已成功连接服务端")))))
2. 从已连接的客户端向服务端发送消息
客户端连接服务端后会得到一个进程对象,直接用这个对象调用process-send-string即可发送消息。示例代码如下:
;; 客户端连接服务端 (setq client-proc (make-network-process :name "rpc-client" :host "localhost" :port 12345 :filter (lambda (proc string) (message "收到服务端消息: %s" string)))) ;; 向服务端发送消息 (process-send-string client-proc "这是客户端发送的测试消息")
服务端可以通过给客户端子进程设置:filter函数来接收并处理这些消息。
3. Emacs使用连接发送消息到服务端进程的方法
核心是获取对应连接的有效进程对象:
- 客户端场景:连接服务端后得到的
client-proc就是可直接用于发送消息的对象,调用process-send-string client-proc "消息内容"即可完成发送。 - 服务端场景:在
sentinel或:filter回调中拿到的客户端子进程对象,是对应单个客户端连接的句柄,用它调用process-send-string就能向该客户端发送消息;若要接收客户端消息,需为该子进程配置:filter函数处理收到的字符串。
额外提示:
- 可以通过
list-processes命令查看当前所有进程,状态为open的是已建立连接的进程,listen是监听进程。 - 若丢失进程对象,可通过进程名用
get-process函数获取,比如(get-process "rpc-client")。
内容的提问来源于stack exchange,提问作者L0ren2
相关产品推荐
相关产品推荐

