我是从这里安装的 Emacs,master
各位有兴趣的可以执行二楼一段 elisp 代码简单测试一下在你的电脑上有没有问题
开启 lsp watch mode 后,文件超过 975 个之后会报错
Failed to create a watch for File watching not possible, no file descriptor left: 975: message
Emacs 中可能相关的源码在这里 emacs/kqueue.c at 3af9e84ff59811734dcbb5d55e04e1fdb7051e77 · emacs-mirror/emacs · GitHub
/* Check available file descriptors. */
#ifdef HAVE_GETRLIMIT
if (! getrlimit (RLIMIT_NOFILE, &rlim))
maxfd = rlim.rlim_cur;
else
#endif /* HAVE_GETRLIMIT */
maxfd = 256;
/* We assume 50 file descriptors are sufficient for the rest of Emacs. */
ptrdiff_t watch_list_len = list_length (watch_list);
if (maxfd - 50 < watch_list_len)
xsignal2
(Qfile_notify_error,
build_string ("File watching not possible, no file descriptor left"),
make_fixnum (watch_list_len));
看起来是通过 getrlimit 来查询的,于是我尝试这样启动 emacs
ulimit -n 9999 && /usr/local/bin/emacs
然后在 emacs 中用这段代码测试
#include <sys/types.h>
#include <sys/resource.h>
#include <stdio.h>
int main( void )
{
int maxfd;
struct rlimit rlim;
if (! getrlimit (RLIMIT_NOFILE, &rlim))
maxfd = rlim.rlim_cur;
else
maxfd = -1;
printf("test %d", maxfd);
getchar();
return 0;
}
在 shell mode 里执行,得到结果
test 9999
此时启动 lsp mode,依然得到一样的错误
Failed to create a watch for File watching not possible, no file descriptor left: 975: message
请问我哪里做的不对?如何正确进行设置?或者是否需要在编译 emacs 的时候修改某些参数/源码?
感谢各位🙏🏻