On Thu, May 5, 2011 at 2:30 AM, Ferenc Kovacs <i...@tyrael.hu> wrote: > > > On Sat, Apr 30, 2011 at 5:23 PM, Ferenc Kovacs <i...@tyrael.hu> wrote: >>> >>> I actually did consider adding support for an extended form of php://fd >>> where one would specify the desired file descriptor: php://fd/<orig fd>/<new >>> fd>. It would call dup2 instead of dup. >>> >>> However, I got into some trouble on shutdown because this could cause >>> stdout to be closed ahead of time and then the output subsystem would cause >>> either a segfault or a memory leak (can't recall). I didn't spend more than >>> 20 minutes on this as it was not the problem I was trying to solve, so >>> there's probably an easy solution. If you want to work on this, extending >>> php://fd would likely be a good place. >>> >>> -- >>> Gustavo Lopes >>> >>> -- >>> PHP Internals - PHP Runtime Development Mailing List >>> To unsubscribe, visit: http://www.php.net/unsub.php >>> >> >> thanks Gustavo. >> as you check my mail, I also mentioned using dup2 instead of dup, for >> obvious reasons. >> adding dup2 support for the php://fd stream would be better than the >> current situation, but I can't see why are we trying to force everything >> into that. >> I mean everything on the http://www.php.net/manual/en/wrappers.php can be >> achived through a function also. >> there are some case when you can save a couple of lines of code with the >> wrappers and with http://www.php.net/manual/en/context.http.php but there is >> no method for opening FDs or the dup2 that you mentioned. >> I think that it would be more consistent with the rest of the language, >> and one would more likely to find fdopen than fopen('php://fd/1'); in the >> documentation. >> closing the stdout without reopening also caused problems for me in case >> of an error happens, but this shouldn't happen if you properly reopen it, so >> I would be interested what exactly happened there. >> Tyrael > > I put together the fileno, fdopen, dup2, fclose stuff as a pecl > extension(called fildes), the sourcecode available here: > https://github.com/Tyrael/php-fildes > with this, you can do something like this: > <?php > $stdout_fd_orig = fildes_fileno(STDOUT); > fclose(STDOUT); > $stdout = fopen("out.log", "a"); > $fd_tmp = fildes_fileno($stdout); > $stdout_fd = fildes_dup2($fd_tmp, $stdout_fd_orig); > if($stdout_fd != $fd_tmp){ > fildes_close($fd_tmp); > } > echo "Hello world!"; // this goes to out.log > I'm really a novice in C, so any feedback welcome. > particularly > here https://github.com/Tyrael/php-fildes/blob/master/fildes.c#L211 > Tyrael
as somebody pointed out, the example could be simplified as: <?php $stdout = fopen("out.log", "a"); $tmp_fd = fildes_fileno($stdout); if($tmp_fd, fildes_fileno(STDOUT))<0){ fwrite(STDERR, "dup2 failed"); exit; } fildes_close($tmp_fd); echo "Hello world!"; // this goes to out.log Could somebody review the source? as I mentioned in my previous email I had some problem here: https://github.com/Tyrael/php-fildes/blob/master/fildes.c#L211 if I define the second argument as int, the first argument will be always 0. I have no idea whats going there. Tyrael -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php