为什么string命令不会停止?


30

strings命令的行为很奇怪,显然,即使驱动器空间不足,它也不会停止写入文件。还是我想念什么?

我运行以下命令:

# strings /dev/urandom > random.txt

这一直保持运行,甚至在填充磁盘后也没有停止(常规USB闪存)。

为了更快,我创建了一个ramdisk并再次尝试了相同的命令。它也没有停止。

我知道这urandom不是一个常规文件,而且strings的输出也被重定向,但是在以上两种情况下,cat当没有更多空间时,该命令都会报告错误。

# cat /dev/urandom > random.txt
cat: write error: No space left on device
  1. 这是字符串的正常行为吗?如果是这样,为什么?
  2. 没有剩余空间后,数据将写入哪里?

1
这表明您的第一个命令实际上已经填满了磁盘?
库萨兰达

1
@Kusalananda据df报道。我正在使用watch df -h从另一个虚拟终端监视它
user174174

2
@Kusalananda:您可以通过strace strings /dev/urandom > /dev/full
Peter Cordes

2
@mosvy OpenBSD使用stringsGNU binutils 中的相同实现。我指的是strace命令。
库萨兰达

2
@Kusalananda OK,因为“BSD工具链”替换字符串(1)不检查的putchar(返回值)或者
mosvy

Answers:


63

如果GNU cat无法写出读取的内容,它将退出并显示错误消息

/* Write this block out.  */

{
  /* The following is ok, since we know that 0 < n_read.  */
  size_t n = n_read;
  if (full_write (STDOUT_FILENO, buf, n) != n)
    die (EXIT_FAILURE, errno, _("write error"));
}

strings另一方面,GNU 不在乎是否成功编写:

while (1)
  {
    c = get_char (stream, &address, &magiccount, &magic);
    if (c == EOF)
      break;
    if (! STRING_ISGRAPHIC (c))
      {
        unget_part_char (c, &address, &magiccount, &magic);
        break;
      }
    putchar (c);
  }

因此,所有这些写操作都会失败,但会strings持续愉快地进行,直到到达输入结束为止,这将永远不会结束。

$ strace -e write strings /dev/urandom > foo/bar
write(1, "7[\\Z\n]juKw\nl [1\nTc9g\n0&}x(x\n/y^7"..., 4096) = 4096
write(1, "\nXaki%\ndHB0\n?5:Q\n6bX-\np!E[\n'&=7\n"..., 4096) = 4096
write(1, "%M6s\n=4C.%\n&7)n\nQ_%J\ncT+\";\nK*<%\n"..., 4096) = 4096
write(1, "&d<\nj~g0\nm]=o\na=^0\n%s]2W\nM7C%\nUK"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "~\nd3qQ\n^^u1#\na#5\\\n^=\t\"b\n*91_\n ]o"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "L\n6QO1x\na,yE\nk>\",@Z\nyM.ur\n~z\tF\nr"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "\n61]R\nyg9C\nfLVu\n<Ez:\n.tV-c\nw_'>e"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "\nCj)a\nT]X:uA\n_KH\"B\nRfQ4G\n3re\t\n&s"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "j\nk7@%\n9E?^N\nJ#8V\n*]i,\nXDxh?\nr_1"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "ia\tI\nQ)Zw\nnV0J\nE3-W \n@0-N2v\nK{15"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "\nZ~*g\n)FQn\nUY:G\ndRbN\nn..F\nvF{,\n+"..., 4096) = -1 ENOSPC (No space left on device)
...

19
很好的分析。我认为这应该视为的错误strings
卡巴斯德

3
有人打算报告该错误吗?
Nate Eldredge
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.