Linux
為什麼字元串命令不會停止?
該
strings
命令的行為很奇怪,顯然即使驅動器空間不足,它也不會停止寫入文件。或者也許我錯過了什麼?我執行以下命令:
# strings /dev/urandom > random.txt
這一直在執行,即使在填充磁碟(普通的 USB 快閃記憶體)後也沒有停止。
然後為了更快,我創建了一個 ramdisk 並再次嘗試了相同的命令。它也沒有停止。
我知道這
urandom
不是正常文件,並且strings
’ 的輸出也被重定向,但是在上述兩種情況下,cat
當沒有更多空間時,該命令都會報告錯誤。# cat /dev/urandom > random.txt cat: write error: No space left on device
- 這是字元串的正常行為嗎?如果是這樣,為什麼?
- 沒有更多空間後寫入的數據在哪裡?
如果 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) ...