Dizeler komutu neden durmuyor?


30

stringsKomutunun davranış esrarlı, görünüşe göre sürücü alanı tükendi bile bir dosyaya yazma durmuyor. Ya da belki bir şey özlüyorum?

Aşağıdakileri çalıştırıyorum:

# strings /dev/urandom > random.txt

bu çalışmaya devam ediyordu ve diski doldurduktan sonra bile durmadı (normal bir usb flaş).

sonra daha hızlı olmak için bir ramdisk oluşturdum ve aynı komutu tekrar denedim. Ayrıca durmadı.

Bunun urandomnormal bir dosya olmadığını ve stringsçıktısının yeniden yönlendirildiğini anlıyorum , ancak yukarıdaki her iki durumda da, catkomut daha fazla boşluk olmadığı zaman hatayı bildirdi.

# cat /dev/urandom > random.txt
cat: write error: No space left on device
  1. Bu normal karakter dizileri midir? Öyleyse neden?
  2. Boş alan kaldıktan sonra yazılan veriler nerede?

1
İlk komutunuzun diski gerçekten doldurduğuna dair gösterge neydi?
Kusalananda

1
@Kusalananda df tarafından bildirildi. Df -h saatini kullanarak başka bir sanal terminalden
izliyordum

2
@Kusalananda: Bunu kolayca test edebilirsinizstrace strings /dev/urandom > /dev/full
Peter Cordes

2
@mosvy OpenBSD, aynı stringsuygulamayı GNU binutils'inde kullanıyor. Ben atıfta bulundu stracekomuta.
Kusalananda

2
@Kusalananda Tamam, dizeleri değiştirilmesi (1) "araç zinciri BSD") putchar (dönüş değeri için denetlemediği için ya
mosvy

Yanıtlar:


63

GNU catokuduğunu yazamazsa, bir hatayla çıkar :

/* 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"));
}

GNU strings, diğer taraftan, umursamıyor başarıyla yazmayı başardı olsun:

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);
  }

Böylece bütün bu yazılar başarısız olur, ancak stringsasla olmayacak olan girdi sonuna ulaşana kadar, neşeyle devam eder.

$ 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
Güzel analiz. Bunun bir hata olarak kabul edilmesi gerektiğini söyleyebilirim strings.
kasperd

3
Hatayı bildirmeyi planlayan var mı?
Nate Eldredge
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.