From: steve at estel.uindy.edu (Steve Spicklemire)
Date: Mon, 12 Apr 1999 10:38:47 GMT
Subject: forking + stdout = confusion
In-Reply-To: <RUgQ2.31$Oq4.32657@newsfeed.avtel.net> (clarence@silcom.com)
References: <RUgQ2.31$Oq4.32657@newsfeed.avtel.net>
Message-ID: <199904121038.FAA28479@estel.uindy.edu>
Content-Length: 1981
X-UID: 1313                                                  

Hi Clarence,

>>>>> "Clarence" == Clarence Gardner <clarence at silcom.com> writes:

[snip]

    Clarence> def LateShift():
    Clarence>     OutputID = `os.getpid()`
    Clarence>     Child = os.fork()
    Clarence>     if Child:
    Clarence>         print 'content-type: text/plain'
    Clarence>         print
    Clarence>         print '''The program is waiting to run later.  The output will
    Clarence>                 be available with the id number of %s.
    Clarence>                 ''' % OutputID
    Clarence>         sys.exit(0)
    Clarence>     sys.stdin.close()
    Clarence>     sys.stdout.close()
    Clarence>     sys.stderr.close()
    Clarence>     sys.stdout = open(os.path.join(SpoolDir, OutputID), 'w')
    Clarence>     sys.stderr = sys.stdout
    Clarence>     time.sleep(15)

[snip]

Hmm.. the following code works for me:

    try:
        serr = sys.stderr
        sys.stderr = sys.stdout

        sys.stdout.flush()
        pid = os.fork()
        if pid:
            #
            # OK...we are the parent process
            #
            sys.stdout.close()
            sys.stdin.close()

            os.wait()
        else:
            sys.stderr = serr
            sys.stdout.close()
            sys.stdin.close()

            ... on to do time consuming task.....

    Clarence> I thought that maybe sys.stdout was using a dup()'ed
    Clarence> copy of stdout, but I checked sys.stdout.fileno() and it
    Clarence> was 1, so that doesn't seem to be the case.

    Clarence> Can anyone hazard a guess (or see right off the top of
    Clarence> his head) what's going on here?  Thanks for any help.

I'm not sure, but I think sys.stdout is always 1. I think you need to close
sys.stdxxx in both processes explicitly. At least it works on my systems.

good luck!
-steve

    Clarence> -- -=-=-=-=-=-=-=-= Clarence Gardner AvTel
    Clarence> Communications Software Products and Services Division
    Clarence> clarence at avtel.com










