명령 은 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)
...