Jonas Maebe wrote 21 lines
On 13 Nov 2008, at 01:42, Marc Santhoff wrote:
> long time ago I had problems with stdxxx being in non-blocking i/o
> mode.
> The suggestion was to close and re-open the channels from the system
> units init code.
>
> I ran into this problem again and would like to know:
>
> How can I close and reopen stderr and sdtout from my program?
close(stderr);
assign(stderr,'');
rewrite(stderr);
close(stdout);
assign(stdout,'');
rewrite(stdout);
This does not enable you to set any particular options on the
descriptors though,
As expected it does work but doesn't change blocking behaviour.
and I'm not aware of any supported way for doing
so (read: a way which is likely to be forward compatible).
Don't get you here, what do you mean by forward compatible?
And even if
you could get at the file descriptors, there is also no cross-platform
functionality that I'm aware of to change their (non-)blocking setting.
No, not cross platform, but I was able to make a solution for FreeBSD 4, I assume it'll work (with minor modifications) on other unix-like platforms:
uses unix;
var
res: longint; // or cint
begin
res := fpfcntl(TextRec(stderr).Handle, F_GETFL);
if ((O_NONBLOCK AND res)>0) then
begin
res := res AND (NOT O_NONBLOCK);
res := fpfcntl(TextRec(stderr).Handle, F_SETFL, res);
if (res=-1) then writeln(stderr, 'ERROR on SETFL');
end;
This switches the channel to blocking mode and the overrun errors disappear in this case.
Thanks for your help,
Marc