Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

syswrite "Bad file descriptor" after successfully writing to that file handle

23 views
Skip to first unread message

Robert Jacobson

unread,
Jan 7, 2008, 10:31:31 AM1/7/08
to

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?

Robert Jacobson

unread,
Jan 8, 2008, 9:24:49 AM1/8/08
to
On Jan 7, 10:31 am, Robert Jacobson <q2m3ef...@sneakemail.com> 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?

Ben Morrow

unread,
Jan 8, 2008, 12:00:50 PM1/8/08
to

Quoth Robert Jacobson <q2m3...@sneakemail.com>:

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

Robert Jacobson

unread,
Jan 11, 2008, 11:09:10 AM1/11/08
to
On Jan 8, 12:00 pm, Ben Morrow <b...@morrow.me.uk> wrote:
> Quoth Robert Jacobson <q2m3ef...@sneakemail.com>:

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.

0 new messages