ทำไมคำสั่ง strings จะไม่หยุด?


30

stringsพฤติกรรมคำสั่งวิจิตรพิสดารเห็นได้ชัดว่ามันไม่ได้หยุดเขียนไปยังแฟ้มแม้ว่าไดรฟ์วิ่งออกไปจากพื้นที่ หรือบางทีฉันหายไปบางอย่าง

ฉันเรียกใช้ต่อไปนี้:

# strings /dev/urandom > random.txt

สิ่งนี้ยังคงทำงานต่อไปและไม่หยุดแม้หลังจากเติมดิสก์ (แฟลช usb ทั่วไป)

ถ้าอย่างนั้นฉันจะสร้าง ramdisk ให้เร็วขึ้นและลองคำสั่งเดิมอีกครั้ง มันยังไม่หยุด

ฉันเข้าใจว่าurandomไม่ใช่ไฟล์ปกติและstringsเอาต์พุตของยังถูกเปลี่ยนเส้นทางอย่างไรก็ตามในทั้งสองกรณีข้างต้นcatคำสั่งรายงานข้อผิดพลาดเมื่อไม่มีที่ว่าง

# cat /dev/urandom > random.txt
cat: write error: No space left on device
  1. นี่เป็นพฤติกรรมปกติของสตริงหรือไม่ ถ้าเป็นเช่นนั้นทำไม
  2. ข้อมูลจะถูกเขียนที่ไหนหลังจากไม่มีพื้นที่เหลืออีกแล้ว?

1
อะไรคือข้อบ่งชี้ว่าคำสั่งแรกของคุณเติมดิสก์จริง?
Kusalananda

1
@ Kusalananda มีการรายงานโดย df ฉันตรวจสอบจากเทอร์มินัลเสมือนอื่นโดยใช้ watch df -h
user174174

2
@Kusalananda: คุณสามารถทดสอบสิ่งนี้ได้อย่างง่ายดายด้วยstrace strings /dev/urandom > /dev/full
Peter Cordes

2
@mosvy OpenBSD ใช้stringsการดำเนินการเดียวกันนี้จาก GNU binutils ฉันหมายถึงstraceคำสั่ง
Kusalananda

2
@ Kusalananda โอเคเพราะการแทนที่ "BSD toolchain" ของสตริง (1) ไม่ได้ตรวจสอบค่าส่งคืนของ putchar () อย่างใดอย่างหนึ่ง
mosvy

คำตอบ:


63

หาก 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)
...

19
การวิเคราะห์ที่ดี stringsผมว่าควรจะถือว่าเป็นข้อผิดพลาดใน
kasperd

3
ใครวางแผนที่จะรายงานข้อผิดพลาด?
Nate Eldredge
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.