为什么 /tmp/emacs${UID}/server 在最后一个 emacsclient 退出后会变得陈旧?

为什么 /tmp/emacs${UID}/server 在最后一个 emacsclient 退出后会变得陈旧?

使用 GNU Emacs 23.2.1,我从两个不同的 GNU/Linux 发行版(CentOS 4.x 和 Ubuntu Hardy - 均带有 KDE 3.x)上的源代码安装

我愿意:

$ emacs --daemon
("emacs")
Starting Emacs daemon.
$ emacsclient -c
Waiting for Emacs...

Emacs 按预期启动。然后我关闭客户端。fuser /tmp/emacs${UID}/server表示套接字处于活动状态,并且emacs --daemon进程正在运行。

$ emacsclient -c
Waiting for Emacs...

Emacs 无法启动。fuser /tmp/emacs${UID}/server表示套接字已过时,并且emacs --daemon进程不再存在。因此:

$ emacsclient -c
emacsclient: connect: Connection refused
emacsclient: No socket or alternate editor.  Please use:

        --socket-name
        --server-file      (or environment variable EMACS_SERVER_FILE)
        --alternate-editor (or environment variable ALTERNATE_EDITOR)

当我保持至少一个客户端运行时,我可以打开和关闭任意数量的其他客户端。

我的问题是:

  1. 其他人能看到这种行为吗?
  2. 有没有办法即使在最后一个客户端退出后仍保持套接字活动?
  3. 有没有好的方法检查套接字是否允许打开另一个客户端?
  4. 如果插座不再可用,为什么它还保留着?

编辑:似乎出现了段emacs --daemon错误。我将其发布为错误 7149

答案1

其他人能看到这种行为吗?

是的,尽管我的工作风格不同。我在 .emacs 文件中使用了 (server-start),而不是使用命令行参数。

有没有办法即使在最后一个客户端退出后仍保持套接字活动?

你正在用吗CX#彻底关闭客户端缓冲区?

有没有办法即使在最后一个客户端退出后仍保持套接字活动?

我发现我必须Mx 服务器启动在已经运行了几天或更长时间的 Emacs 上。这并不是真正地让它保持运行,而是重新创建它。

如果插座不再可用,为什么它还保留着?

我相信这是一个错误。

答案2

我可以通过删除包含套接字的目录来解决这个问题。我运行了:

strace emacsclient -c

并看到以下几行:

stat("/tmp/emacs1000/server", {st_mode=S_IFSOCK|0700, st_size=0, ...}) = 0
connect(3, {sa_family=AF_FILE, path="/tmp/emacs1000/server"}, 23) = -1 ECONNREFUSED (Connection refused)

显示套接字文件所在的目录,然后我要做的就是删除该目录:

rm -rf /tmp/emacs1000

相关内容