هل هناك طريقة بسيطة للتحقق مما إذا كان مثيل IO IO RUBY سوف يحظر القراءة ()؟

StackOverflow https://stackoverflow.com/questions/930989

سؤال

أبحث عن طريقة في روبي وهو أساسا هذا:

io.ready_for_read?

أنا فقط أريد التحقق مما إذا كانت معينة IO كائن (في حالتي، نتيجة popen استدعاء) لديه إخراج متاح، أي متابعة المتابعة io.read(1) لن تمنع.

هذه هي الخياران الذي أراه، لا أحد الذي أعجبني:

  1. io.read_nonblock - رقيقة جدا تجريد يونيكس read() - أنا لا أريد التعامل معه errno معالجة الأخطاء.

  2. io.select مع مهلة 0 - يحث الغرض من هذه العملية البسيطة.

هل هناك بديل أفضل لقد أغفلت؟

هل كانت مفيدة؟

المحلول

متأخرا بعض الشيء، ولكن إذا كنت require 'io/wait', ، يمكنك استخدام ready? للتحقق من أن io يمكن قراءتها دون حظر. منحت، اعتمادا على مدى أن تنوي القراءة (وكيف تخطط للقيام بذلك) قد لا يزال كائن IO الخاص بك كتلة، ولكن هذا يجب أن يساعد. لست متأكدا مما إذا كانت هذه المكتبة مدعومة على جميع المنصات، وأنا لا أعرف أيضا لماذا تم فصل هذه الوظيفة عن بقية مكتبة IO. رؤية المزيد هنا: http://ruby-doc.org/stdlib/libdoc/io/wait/rdoc/

نصائح أخرى

أنا مستعد لاستنتاج أنه لا، لا توجد طريقة بسيطة للقيام بذلك. لكل اقتراح بيتر كوبر، هنا هو IO#ready_for_read?:

class IO
  def ready_for_read?
    result = IO.select([self], nil, nil, 0)
    result && (result.first.first == self)
  end
end

على النوافذ رأيت بعض التناقضات مع IO / الانتظار. وبعد روبي لدي هنا الآن هو:

روبي 1.9.2p136 (2010-12-25) [i386-mingw32

على هذا واحد نريد و جاهز؟ يتم تنفيذها، لكنها تعيد نتائج خاطئة. في نسخة مختلفة كنت أستخدمها جاهز؟ كان لا يزال مكسورا و نريد لم تكن موجودة حتى.

احتمال واحد هو استخدام io.stat.size., ، الذي يخبرك بعدد البايتات المتاحة للقراءة في مجرى IO.http://www.ruby-doc.org/core/classes/file/stat.html.

تشير الوثائق إلى أنه من أجل الملفات، لكنني استخدمتها على الأنابيب المتصلة بعملية منفصلة (عبر Open3.popen3). انها عملت بالنسبة لي حتى الآن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top