স্ট্রিং কমান্ড কেন থামবে না?


30

stringsকমান্ড আচরণ করবে weirdly, আপাতদৃষ্টিতে এটি লেখা একটি ফাইলে থামবে না এমনকি যদি ড্রাইভ সঞ্চয়ের সীমা ছাড়িয়ে। বা সম্ভবত আমি কিছু মিস করছি?

আমি নিম্নলিখিত চালাতে:

# strings /dev/urandom > random.txt

এটি চলমান রাখা ছিল এবং ডিস্কটি পূরণ করার পরেও থামেনি (একটি নিয়মিত ইউএসবি ফ্ল্যাশ)।

তারপরে দ্রুত হওয়ার জন্য আমি একটি রামডিস্ক তৈরি করেছি এবং আবার একই আদেশটি চেষ্টা করেছি tried এটাও থামেনি।

আমি বুঝতে পারি যে urandomকোনও নিয়মিত ফাইল নয় এবং stringsএর আউটপুটও পুনঃনির্দেশিত হয়, তবে উপরের উভয় ক্ষেত্রেই catকমান্ডটি কোনও স্থান না থাকায় ত্রুটিটি রিপোর্ট করেছিল।

# cat /dev/urandom > random.txt
cat: write error: No space left on device
  1. এই স্ট্রিং এর স্বাভাবিক আচরণ? যদি তাই হয় তবে কেন?
  2. আর জায়গা নেই বলার পরে ডেটা কোথায় লেখা আছে?

1
আপনার প্রথম কমান্ডটি আসলে ডিস্কটি পূর্ণ করেছে এমন ইঙ্গিতটি কী ছিল?
কুসালানন্দ

1
@ কুসালানন্দ এটি ডিএফ দ্বারা রিপোর্ট করা হয়েছিল আমি ঘড়ি df -h ব্যবহার করে অন্য ভার্চুয়াল টার্মিনাল থেকে এটি পর্যবেক্ষণ
করছিলাম

2
@ কুসালানন্দ: আপনি এটির মাধ্যমে সহজে পরীক্ষা করতে পারবেনstrace strings /dev/urandom > /dev/full
পিটার

2
@ মোসভি ওপেনবিএসডি stringsজিএনইউ বাইন্টিলস থেকে একই প্রয়োগ ব্যবহার করে । আমি straceআদেশটি উল্লেখ করছিলাম ।
Kusalananda

2
@Kusalananda ঠিক আছে, স্ট্রিং রিপ্লেসমেন্ট (1) "টুলচেইন বাসদ" putchar (ফেরত মান জন্য চেক না কারণ) পারেন
mosvy

উত্তর:


63

জিএনইউ যদি 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অন্যদিকে, জিএনইউ সাফল্যের সাথে লিখতে পেরেছে কিনা তা চিন্তা করে না :

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
ক্যাস্পারড

3
কেউ বাগ রিপোর্ট করার পরিকল্পনা করছেন?
ন্যাট এল্ড্রেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.