syswrite "Bad file descriptor" after successfully writing to that
syswrite "Bad file descriptor" after successfully writing to that
am 07.01.2008 16:31:31 von Robert Jacobson
I'm having some trouble figuring out an error that I'm getting.
syswrite is failing to write; $! is "Bad file descriptor". What
boggles my mind is that this is after some data had already been
written successfully to the file handle!
This problem seems to be linked to a recent change I made to my
program. My program is basically a network socket data collector,
running on Windows with ActivePerl 5.8.8 (build 819)
- open data file (sysopen)
- connect to server socket
- while read from server socket OK
- write data to file
- if X time elapsed:
- close file
- open new file
I recently changed my program to add "use threads", and add a
conversion program in that thread
....
- if X time elapsed:
- close file
- new thread for &convert_file(). I call $thread->detach
immediately after creation
- open new file
After I made the above change, syswrite started *occassionally*
returning undef, and setting $! to "Bad file descriptor". Again, most
of the time it works. When it fails, it does seem to be while
convert_file() is still running. It takes about 10 seconds to convert
the file; that's why I'm using a separate thread. The program writes
about 400 kB to the file, then I get the "Bad file descriptor" error.
For kicks, I tried changing syswrite() to print(), but it also seems
to be having trouble.
So, what should my next troubleshooting steps be?
Re: syswrite "Bad file descriptor" after successfully writing to that
am 08.01.2008 15:24:49 von Robert Jacobson
On Jan 7, 10:31 am, Robert Jacobson wrote:
> - if X time elapsed:
> - close file
> - new thread for &convert_file(). I call $thread->detach
I think I have fixed the problem, though I still don't know why it was
occurring.
In convert_file(), I was using a system() call to start an external
perl script. I basically copied the perl code from that external
script into convert_file(), and the problem seems to have gone away.
At least, I didn't have any problems in the past 16 hours or so.
If anyone can tell me -- is using system() inside a thread "bad" for
some reason? If so, why?
Re: syswrite "Bad file descriptor" after successfully writing to that
am 08.01.2008 18:00:50 von Ben Morrow
Quoth Robert Jacobson :
> On Jan 7, 10:31 am, Robert Jacobson wrote:
>
> > - if X time elapsed:
> > - close file
> > - new thread for &convert_file(). I call $thread->detach
>
> I think I have fixed the problem, though I still don't know why it was
> occurring.
>
> In convert_file(), I was using a system() call to start an external
> perl script. I basically copied the perl code from that external
> script into convert_file(), and the problem seems to have gone away.
> At least, I didn't have any problems in the past 16 hours or so.
>
> If anyone can tell me -- is using system() inside a thread "bad" for
> some reason? If so, why?
Likely some interaction between system and threads and pseudo-fork. Can
you post a *minimal* example that reproduces the problem, including your
versions of perl, threads and threads::shared? Have you tried upgrading
to the latest threads?
Ben
Re: syswrite "Bad file descriptor" after successfully writing to that
am 11.01.2008 17:09:10 von Robert Jacobson
On Jan 8, 12:00 pm, Ben Morrow wrote:
> Quoth Robert Jacobson :
>
>
>
> > On Jan 7, 10:31 am, Robert Jacobson wrote:
>
> > > - if X time elapsed:
> > > - close file
> > > - new thread for &convert_file(). I call $thread->detach
>
> > I think I have fixed the problem, though I still don't know why it was
> > occurring.
>
> > In convert_file(), I was using a system() call to start an external
> > perl script. I basically copied the perl code from that external
> > script into convert_file(), and the problem seems to have gone away.
> > At least, I didn't have any problems in the past 16 hours or so.
>
> > If anyone can tell me -- is using system() inside a thread "bad" for
> > some reason? If so, why?
>
> Likely some interaction between system and threads and pseudo-fork. Can
> you post a *minimal* example that reproduces the problem, including your
> versions of perl, threads and threads::shared? Have you tried upgrading
> to the latest threads?
>
> Ben
Thanks for responding.
I'll see if I can reduce it to a minimal example and post it here.
I am using ActivePerl 5.8.8 (build 819) (32-bit). The threads version
is whatever ActivePerl came with. I did not use threads::shared.