[gambit-list] process-status, close-port, and zombie processes

Lang Martin lang-gb at coptix.com
Wed Sep 5 18:15:58 EDT 2007


I've been building a system that runs (without a tty, if that makes a  
difference) in the background on a Linux system, and which, in turn  
runs a series of processes. It's in a fairly normal shell script  
pipeline and exists for the purpose of multi-threading this one step  
of the pipeline.

All seems to be well running interactively. However, when the process  
runs as a gsi-script, it blocks inside ##thread-sleep! in ##process- 
status. The final result is the script running at 100% of the CPU  
(polling the port, seemingly) with a dangling child process, which  
has already exitted (exat?) and is now a zombie.

It seems as though once this happens, each remaining open-process  
port will block until the full timeout of process-status is reached.

the most relevant functions are here:

(define (throw-shell-error port timeout)
   (or (zero? (process-status port timeout 100))
       (error "fg command failed"))
   (close-port port))

(define (bg cmd . arguments)
   (open-process (list path: cmd
                       arguments: arguments)))

(define (fg cmd . arguments)
   (let ((proc (open-process
                (list path: cmd
                      arguments: arguments))))
     (throw-shell-error proc *join-timeout*)))

I am running these commands purely for side-effects, and not reading  
from or writing to their ports.

The problem appears to have something to do with load -- I can run a  
large number of low impact commands, and a much smaller number of  
"convert" (from the ImageMagick tools) commands before the zombie  
processes begin to block my execution.

So, as I'm investigating: am I using these commands in the fashion  
intended by the author? I believe that they are correct in the sense  
of indicating the programs I mean to run, but am I misusing the port  
metaphor in some fashion? Any help would be appreciated.

For a bit I had each process represented by a gambit thread, but I'm  
currently just mapping over collections of ports.

Gambit v4.0.0, Linux 2.6.17.3 running under gsi-script, same behavior  
with and without -:d. I haven't used other options to gsi-script.



More information about the Gambit-list mailing list