emacs无法读取file stat size为0的文件的全部内容

有一些/proc下面的文件用emacs没办法读取全部内容。emacs的策略是如果file stat size为0则只读一个READ_BUF_SIZE大小的内容。但是用vim,cat,less都可以全部读出来。我把那几个的源码都稍微读了一下。它们都是会读到eof或者报错。

例如vim

/* vim/src/fileio.c:1124 */

while (!error && !got_int)
{
 // ...

/* vim/src/fileio.c:1295 */

eof = size;
size = read_eintr(fd, ptr, size);
filesize_count += size;
// hit end of file
eof = (size < eof || filesize_count == filesize_disk);

以及cat

// src/cat.c
  while (true)
    {
      /* Read a block of input.  */

      size_t n_read = safe_read (input_desc, buf, bufsize);
      if (n_read == SAFE_READ_ERROR)
        {
          error (0, errno, "%s", quotef (infile));
          return false;
        }

我往devel的邮件列表里发了邮件也没有人理我。emacs的这段代码可能是10到20年前的了。我也不知道问谁这么写的原因是不是有什么我没考虑到的因素。

/* emacs/src/fileio.c:4077 */

      /* The file size returned from fstat may be zero, but data
         may be readable nonetheless, for example when this is a
         file in the /proc filesystem.  */
      if (end_offset == 0)
        end_offset = READ_BUF_SIZE;

想问问 @oldosfan 大佬一般这种情况怎么搞。是修好了直接邮件发patch呢还是说要跟maintainer讨论一下怎么修?

/proc 下的文件都是内存文件, 并不是磁盘文件, 只是挂载在 /proc 下而已。

是的我知道,就是超过16384byte的内容就显示不出来了。只能用vim。。。

或者把内容cat进到emacs里,还不能revert buffer刷新内容。。。

直接把 patch 放 bug report 邮件里提交上去,然后等 Eli 或者其他人 review,视情况估计要等几天

从你的截图我估计当时 RMS 写这里的时候偷懒了,因为没有快速判断文件长度的方法,就要么逐字符比较会很没效率,而比较快的方法算法又有点复杂就没写

这是 bug#9800。

3 个赞

这个bug前几个月又有人讨论,感兴趣可以看9800和关联的其他bug

多谢,原来是个几十年的bug了。给同事安利emacs很尴尬地碰上了这个bug。