J>>   while (s =  msq.recv 100, 100)

t>  at this step, recv will receive an interrupt and sysvipc will call
t>  rb_sys_fail() 

J>> ensure

t>  ruby begin to execute the ensure block, but after the first node it test
t> if it has received an interrupt and because it's true it exit the block
t> (longjmp) 

Interesting. So are you saying that if an interrupt occurs, ensure
blocks are not *supposed* to be executed when rb_sys_fail() is called?
Dave's example did execute the ensure block when an interrupt was seen
but maybe there was no rb_sys_fail() involved?

What would be the remedy?  replace rb_sys_fail() with something else
in sysvipc.c?  I tried replacing it with rb_raise() but the same
result occurred.

thanks,
-joe