문자열 명령이 중지되지 않는 이유는 무엇입니까?

문자열 명령이 중지되지 않는 이유는 무엇입니까?

명령 은 strings이상하게 작동합니다. 드라이브에 공간이 부족하더라도 파일 쓰기가 중단되지 않는 것 같습니다. 아니면 제가 뭔가를 놓치고 있는 걸까요?

다음 명령을 실행합니다.

# strings /dev/urandom > random.txt

디스크(일반 USB 플래시 드라이브)를 채운 후에도 계속 실행되고 멈추지 않았습니다.

그런 다음 속도를 높이기 위해 가상 디스크를 만들고 동일한 명령을 다시 시도했습니다. 그것도 멈추지 않았습니다.

나는 이것이 urandom일반 파일이 아니며 strings의 출력이 리디렉션된다는 것을 알고 있지만 위의 두 경우 모두 cat더 이상 공간이 없으면 명령이 오류를 보고합니다.

# cat /dev/urandom > random.txt
cat: write error: No space left on device
  1. 이것이 문자열의 정상적인 동작입니까? 그렇다면 왜 그렇습니까?
  2. 공간을 모두 사용한 후 데이터는 어디에 기록되나요?

답변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)
...

관련 정보