コマンドはstrings
奇妙に動作します。ドライブに空き容量がなくてもファイルの書き込みが中断されないようです。それとも私が何かを見逃しているのでしょうか?
次のコマンドを実行します。
# strings /dev/urandom > random.txt
ディスク(通常のUSBフラッシュドライブ)をいっぱいにした後も、実行が継続して停止しませんでした。
その後、速度を上げるために仮想ディスクを作成し、同じコマンドを再試行しました。それも止まらなかった。
私はこれがurandom
通常のファイルではなく、出力がリダイレクトstrings
されることを知っていますが、上記のいずれの場合ももはやスペースがcat
ない場合、コマンドはエラーを報告します。
# cat /dev/urandom > random.txt
cat: write error: No space left on device
- これは文字列の正常な動作ですか?では、なぜそうなのでしょうか?
- すべてのスペースを使用した後、データはどこに記録されますか?
答え1
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)
...