in reply to require in script breaks module

But I would like to understand why the require statement in the script is "breaking" the module

My guess (and it is just a guess) is that when the require happens in the script, it is before the require in the module (since require only happens at run-time). The require in the module then is a no-op because the target has already been loaded once. But the scope of the exported FIONREAD() function is in the script now and not the module, so the call to the sub in the module fails.

Does that make sense? You could probably confirm this with Devel::Trace or similar.