[unix] 문자열 명령이 멈추지 않는 이유는 무엇입니까?

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. 더 이상 남은 공간이 없으면 데이터는 어디에 기록됩니까?


답변

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


답변