سؤال

لدي برنامج نصي Ruby الذي يقوم ببعض عمليات Perforce (من خلال برامج البرمجة النصية)، ثم ينتهي ببساطة:

def foo()
  ...
end

def bar()
  ...
end

foo()
bar()
puts __LINE__
exit 0
#end of file

... وبينما خط سوف تطبع، العملية لا تنتهي أبدا، سواء كان الخروج (0) موجودا أم لا. هذا روبي 1.8.6، في المقام الأول على جهاز Mac، لكنني أرى هذا على جهاز الكمبيوتر أيضا.

أقوم بعمل Google المعتادة، لكنه يأمل أن يكون هناك صوت خبرة هنا للبنك. شكرا.

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

المحلول

أنا لست على الإطلاق على الإطلاق مع Perforce، ولكن قد يكون الجاني at_exit الطريقة التي عالقة في حلقة لسبب ما. لاحظ السلوك باستخدام irb, ، على سبيل المثال:

$ irb
irb(main):001:0> require 'time'
=> true
irb(main):002:0> at_exit { puts Time.now; sleep 10; puts Time.now }
=> #<Proc:0xb7656f64@(irb):2>
irb(main):003:0> exit
Fri Mar 12 19:46:25 -0500 2010
Fri Mar 12 19:46:35 -0500 2010

لتأكيد ما إذا كان at_exit وظيفة تسبب تعلق العملية، يمكنك محاولة ربط الدخول at_exit. وبعد نلاحظ أن #{caller} سوف يعرض تتبع مكدس من الذي دعا at_exit:

def at_exit &block
    @at_exit_counter ||= 0
    puts "at_exit #{@at_exit_counter} called"
    s = "Calling at_exit ##{@at_exit_counter} from #{caller}"
    super { puts s; block.call() }
    @at_exit_counter += 1
end

at_exit { puts "I'll never return"; sleep 1 while true; }
at_exit { puts 'I am about to leave.' }

def do_cleanup
    puts "Cleaning..."
    at_exit { puts 'Cleaning up before exit...' }

end

do_cleanup

ما النواتج:

AT_EXIT 0 يسمى at_exit 1 يسمى التنظيف ... AT_EXIT 2 يسمى Calling At_Exit # 2 من Exitcheck.rb: 14: in `do_cleanup'Exitcheck.rb: 18 التنظيف قبل الخروج ... الاتصال AT_EXIT # 1 من Exitcheck.rb: 10 أنا على وشك مغادرة. استدعاء at_exit # 0 من exitcheck.rb: 9 لن أعود أبدا

ولا تعود أبدا.

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