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.