ID:               44217
 Comment by:       duane at e164 dot org
 Reported By:      exe at travian dot org
 Status:           Open
 Bug Type:         Filesystem function related
 Operating System: GNU/Linux Kernel 2.6.18
 PHP Version:      5.2.5
 New Comment:

The solution to stopping this output is rather simple. After you close
the stdin/stdout/stderr open 3 new file descriptors to /dev/null and all
output goes bye bye. eg.

        fclose(STDIN);
        fclose(STDOUT);
        fclose(STDERR);

        $fp1 = fopen('/dev/null', 'r');
        $fp2 = fopen('/dev/null', 'w');
        $fp3 = fopen('/dev/null', 'w');


Previous Comments:
------------------------------------------------------------------------

[2008-02-25 11:54:22] exe at travian dot org

I'd expect php to discard every output after STDOUT is closed, instead
of doing a silent exit (which is hard to track because no error handler
or shutdown function is called). Another option (if output in this
situation is considered to be an error) would be to trigger a
warning/fatal and/or call the shutdown function. This would, at least,
make it possible to track this issue.

I have to close STDOUT and STDERR in a daemonized processes to detach
from the controlling terminal.

------------------------------------------------------------------------

[2008-02-24 00:40:01] [EMAIL PROTECTED]

Another bug #44218 describes some more expected behaviour caused by
closing the input/output streams.

NOTE: Correct manual page:
http://www.php.net/manual/en/wrappers.php.php

------------------------------------------------------------------------

[2008-02-24 00:34:08] [EMAIL PROTECTED]

That's quite expected since you're still trying to output to STDOUT.
Why do you want to close STDOUT anyway?

See also: http://www.php.net/wrappers.php

------------------------------------------------------------------------

[2008-02-22 17:32:15] exe at travian dot org

Description:
------------
If STDOUT and/or STDERR are closed, output by the php script cause the
interpreter to exit immediately.

According to strace output, php tries to write to the closed STDOUT
file handle, causing a "Bad file descriptor" error and exit of the
interpreter:

[...]
close(1)                                = 0
[...]
write(1, "foo", 3)                      = -1 EBADF (Bad file
descriptor)
close(0)                                = 0
close(2)                                = 0
[...]
exit_group(0)                           = ?
Process 19177 detached

Reproduce code:
---------------
<?php
fclose(STDOUT);
print "foo";
sleep(10);
?>

Expected result:
----------------
No output, php sleeping for 10 seconds.

Actual result:
--------------
php exits immediately, strace shows an "Bad file descriptor" on the
write() try to STDOUT:

[...]
read(3, "<?php\nfclose(STDOUT);\n\nprint \"fo"..., 8192) = 51
read(3, "", 4096)                       = 0
read(3, "", 8192)                       = 0
close(3)                                = 0
munmap(0x2b1dce200000, 4096)            = 0
close(1)                                = 0
munmap(0x2b1dce202000, 4096)            = 0
write(1, "foo", 3)                      = -1 EBADF (Bad file
descriptor)
close(2)                                = 0
close(0)                                = 0
munmap(0x2b1dce201000, 4096)            = 0
munmap(0x2b1dce1bf000, 266240)          = 0
mmap(NULL, 266240, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x2b1dce1bf000
setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={0, 0}}, NULL) =
0
munmap(0x2b1dce1bf000, 266240)          = 0
brk(0xd36000)                           = 0xd36000
exit_group(0)                           = ?
Process 19196 detached



------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=44217&edit=1

Reply via email to