Thanks a million!  You're totally right, it's just me miss using $!.  I 
had just about figured all that out messing with it today, but I didn't 
understand the $! variable well enough.  Thanks for explaining it to me.

James

On Monday, October 14, 2002, at 02:33  PM, Michael Fowler wrote:

> On Sun, Oct 13, 2002 at 09:50:58PM -0500, James Edward Gray II wrote:
>> What's the best way to to track down the line that is setting the $!
>> variable? I can't quite figure out the rules of this guy.  Once it's 
>> set,
>> what clears it?  Its it localized to subroutines or packages or 
>> anything?
>> I mean, if I'm printing this error out in once place, could it be
>> happening in a far off chunk of code?
>
> $! is errno, which is set by various C functions to indicate what error
> occurred.  It is not, in itself, to be used as an indicator that there 
> is an
> error, as it can be left in a non-zero state from any call.
>
> I suspect you're checking $! to see if an error occurred.  What you 
> should
> be doing is checking each operation (select, read, open, etc.) to see 
> if
> there's an error, then checking $! to see what the reason is.  That's 
> how $!
> is supposed to be used.  See the perldoc perlvar entry on $! for more
> information.
>
> The way select() works could very well be setting $! to EBADF (the 
> error
> you're seeing) as a normal part of its operation.  The way select 
> works at
> the C level is you pass it an integer indicated the largest 
> descriptor, then
> three bit values indicating descriptors to check, then a timeout.  What
> select then does, based on various straces I've seen, is start at 0 
> and go
> up to the integer you gave it, testing each descriptor to see if it's 
> ready;
> if the descriptor isn't actually one that's open, errno will be set to
> EBADF, but select will simply ignore it.
>
>
>> (I don't believe it's the select() complaining, but I'm not totally 
>> sure.)
>
> There's no way for select to return any sort of error.  Just check 
> $nfound
> to see if any descriptors are ready, and handle it from there.
>
>
>> I've tried to use 'b CONDITION' in the debugger to track it down, but 
>> I
>> can't figure out how to write the CONDITION.  It always thinks I mean 
>> a
>> subroutine.  Any help here?  Basically, any and all tips on the $!
>> variable are needed.
>
> As I mentioned, $! is errno, which is set in a variety of functions, 
> most of
> them from the C library.  As a result, the Perl debugger is 
> insufficient for
> tracking down problems with where it's set.  The best way to find out 
> is to
> use strace, ltrace, truss, or whatever system call or library call 
> tracer is
> available on your system.
>
> However, most of the time you don't need to care where errno is set, 
> because
> you're checking the operation that had the problem, and errno is just a
> diagnostic telling you what problem occurred.
>
>
> Michael
> --
> Administrator                      www.shoebox.net
> Programmer, System Administrator   www.gallanttech.com
> --
>
> -- 
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to