Package twisted :: Package internet :: Module process :: Class Process

[frames | no frames]

## Class Process

    Ephemeral --+
                |
               Process

An operating-system Process.

This represents an operating-system process with arbitrary input/output pipes connected to it. Those pipes may represent standard input, standard output, and standard error, or any other file descriptor.

On UNIX, this is implemented using fork(), exec(), pipe() and fcntl(). These calls may not exist elsewhere so this code is not cross-platform. (also, windows can only select on sockets...)

Method Summary
| ``__init__`(self, reactor, command, args, environment, path, proto, uid, gid, childFDs)` Spawn an operating-system process.
| `_execChild(self, path, settingUID, uid, gid, command, args, environment)`
| ``_setupChild`(self, fdmap)` fdmap[childFD] = parentFD The child wants to end up with 'childFD' attached to what used to be the parent's parentFD.
| `childConnectionLost(self, childFD)`
| `closeChildFD(self, childFD)`
| `closeStderr(self)`
| ``closeStdin`(self)` Call this to close standard input on this process.
| `closeStdout(self)`
| `loseConnection(self)`
| `maybeCallProcessEnded(self)`
| `pauseProducing(self)`
| `processEnded(self, status)`
| ``reapProcess`(self)` Try to reap a process (without blocking) via waitpid.
| `resumeProducing(self)`
| `signalProcess(self, signalID)`
| ``write`(self, data)` Call this to write to standard input on this process.
| `writeToChild(self, childFD, data)`
Inherited from Ephemeral
| ``__getstate__`(self)`
| ``__setstate__`(self, state)`

Class Variable Summary
`int` | `debug` = 0
`int` | `debug_child` = 0

Method Details

### __init__(self, reactor, command, args, environment, path, proto, uid=None, gid=None, childFDs=None)
(Constructor)

    Spawn an operating-system process.

    This is where the hard work of disconnecting all currently open
    files / forking / executing the new process happens.  (This is
    executed automatically when a Process is instantiated.)

    This will also run the subprocess as a given user ID and group ID, if
    specified.  (Implementation Note: this doesn't support all the arcane
    nuances of setXXuid on UNIX: it will assume that either your effective
    or real UID is 0.)

    @param childFDs: a dictionary mapping
        fd_in_child -> current_fd_in_parent/'r'/'w'

         If the value is a number, it specifies one of the parent's fds
         that will be remapped to the child's fd. This is useful for
         things like inetd and shell-like file redirection.

         If it is the string 'r', a pipe will be created and attached to
         the child at that fd number, and the parent will be able to
         read from the pipe. This is useful for the child's stdout and
         stderr.

         If it is the string 'w', a pipe will be created and attached,
         and the parent will be able to write into that pipe. This is
         useful for the child's stdin.

        If childFDs is not passed, the default behaviour is to use a
        mapping that opens the usual stdin/stdout/stderr pipes.

### _setupChild(self, fdmap)

    fdmap[childFD] = parentFD

    The child wants to end up with 'childFD' attached to what used to be
    the parent's parentFD. As an example, a bash command run like
    'command 2>&1' would correspond to an fdmap of {0:0, 1:1, 2:1}.
    'command >foo.txt' would be {0:0, 1:os.open('foo.txt'), 2:2}.

    Step 1: close all file descriptors that aren't values of fdmap.
    This means 0 .. maxfds.

    Step 2: for each childFD:
     if fdmap[childFD] == childFD, the descriptor is already in place.
     Make sure the CLOEXEC flag is not set, then delete the entry from
     fdmap.

     if childFD is in fdmap.values(), then the target descriptor is
     busy. Use os.dup() to move it elsewhere, update all fdmap[childFD]
     items that point to it, then close the original. Then fall through
     to the next case.

     now fdmap[childFD] is not in fdmap.values(), and is free. Use
     os.dup2() to move it to the right place, then close the original.

### closeStdin(self)

Call this to close standard input on this process.

### reapProcess(self)

Try to reap a process (without blocking) via waitpid.

This is called when sigchild is caught or a Process object loses its "connection" (stdout is closed) This ought to result in reaping all zombie processes, since it will be called twice as often as it needs to be.

(Unfortunately, this is a slightly experimental approach, since UNIX has no way to be really sure that your process is going to go away w/o blocking. I don't want to block.)

### write(self, data)

Call this to write to standard input on this process.

Class Variable Details

### debug

  Type:
    `int`
  Value:

        0

### debug_child

  Type:
    `int`
  Value:

        0

Generated by Epydoc 2.0 on Sat May 15 20:08:06 2004 | http://epydoc.sf.net