关于windows下emacs报错Creating process pipe: Too many open files的真正解决方法

在windows下用emacs,特别是开了native comp之后,很容易遇到 too may open files的报错。
之前尝试spacemacs/centaur emacs的配置,几乎是必然遇到。遇到了就只能重新打开emacs
看了下论坛里面,以往也有很多这方面的提问,但是没有答案。

于是翻了下源码,发现一个奇怪的地方,如下在src/w32.h

可以看到这里把FD_SETSIZE 写死了,为64

/* MSVC runtime library has limit of 64 descriptors by default */
#define FD_SETSIZE  64
...
#define MAXDESC FD_SETSIZE
#define MAX_CHILDREN  MAXDESC/2

FD_SETSIZE这个值在linux下默认是1024。
windows下并不是有限制,这个值也是可以改的,只是默认为64。
于是把这里改为1024,并且编译时也指定一下宏,编译命令如下

# 完整的编译脚本 https://github.com/Eason0210/build-emacs
CFLAGS='-march=native -Ofast -fno-finite-math-only -DFD_SETSIZE=1024' ./configure --without-dbus --without-native-compilation

重新编译出来的emacs,我本地测试,使用了 centaur emacs,我自己的配置。都没有出现过 too many open files的报错了。
其他有这个问题的人也可以试试,如果能解决这个问题,可以给emacs官方提下pr。

3 个赞

实测,在windows下打开文件的速度确实也有提升,可以尝试打开emacs源码下的lisp/*.elsrc/*.c,能看到很明显的速度差别

更新:只是修改FD_SETSIZE并不能解决这个问题。改了之后只是不报错了,但是没有生效。详细说明见这个帖子 优化windows版本emacs的总结(持续更新 2024-2-5)

这个问题我也遇到很多回了, 但是我却没能固定复现这个问题, 感觉遇到和遇不到有点玄学, 只好不理会, 期待这个问题能有真正解决办法

不幸复现了,先是emacs卡死,一会之后在message栏出现这个 image

我就是做了清空重绘org buffer的操作,看起来是这个操作不能太频繁了,越频繁越容易遇到

有解决办法了,不过怎么改emacs代码还得再看看 优化windows版本emacs的总结(持续更新 2024-2-5) - #11,来自 junmoxiao

以前用treemacs会有这个问题,现在没用treemacs就没遇到这个提示了。

我 doom 或 spacemacs 在 Windows 下都会遇到,所以每次想试试在 win 下用 emacs,最终都被迫放弃了 然后就只能靠 WSL来跑 doom 了