Pipe buffering, accessing C-style stdin/stdout

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Pipe buffering, accessing C-style stdin/stdout

Ingemar Ragnemalm

Dear list,

I have been struggling for quite a while (that is weeks) to get proper
pipe communication with a sublaunched program, using TProcess or
straight pipe/fork/exec calls. This is under Mac OSX, but the problem
should be similar under any Unix.

The problem is the buffering. Using stdio, the data is stalled until the
stdio buffers are full. This is a big problem. Two-way communication is
impossible, and the user feedback is delayed.

After a lot of googling and experimenting, I think I have managed to
make it work, but only in C code, and I want it to run in Pascal. The
key to make it work in C was to call setvbuf at the right time, to set
the buffering mode for stdin/stdout. The problem with FPC is that I
can't find any straightforward way to either get PFile-style
stdin/stdout from the Text-style input/output (surely there is a
connection?), or get the C globals.

I have searched through the fpc and Lazarus sources after the
definitions and possible solutions, tried all ways I can find, but have
not succeeded yet. But surely someone else has ran into this problem?

Shouldn't simply TProcess have unbuffered or line-buffering as default?


/Ingemar

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Pipe buffering, accessing C-style stdin/stdout

Marco van de Voort
> After a lot of googling and experimenting, I think I have managed to
> make it work, but only in C code, and I want it to run in Pascal. The
> key to make it work in C was to call setvbuf at the right time, to set
> the buffering mode for stdin/stdout. The problem with FPC is that I
> can't find any straightforward way to either get PFile-style
> stdin/stdout from the Text-style input/output (surely there is a
> connection?)

Yes. PFile _IS_ Text style.  PFile is the C wrapper implementing buffer,
Text the analogue Pascal buffering.  I assume that settextbuf to 0 didn't work?

( http://www.freepascal.org/docs-html/rtl/system/settextbuf.html )

If that doesn't work, you need to go back to the raw unbuffered IO, do a
IOCTL if necessary.  FPOpen, FPClose, FPWrite, FPRead

Moreover, how does lazarus deal with this?
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Pipe buffering, accessing C-style stdin/stdout

Vincent Snijders
Marco van de Voort schreef:

>> After a lot of googling and experimenting, I think I have managed to
>> make it work, but only in C code, and I want it to run in Pascal. The
>> key to make it work in C was to call setvbuf at the right time, to set
>> the buffering mode for stdin/stdout. The problem with FPC is that I
>> can't find any straightforward way to either get PFile-style
>> stdin/stdout from the Text-style input/output (surely there is a
>> connection?)
>
> Yes. PFile _IS_ Text style.  PFile is the C wrapper implementing buffer,
> Text the analogue Pascal buffering.  I assume that settextbuf to 0 didn't work?
>
> ( http://www.freepascal.org/docs-html/rtl/system/settextbuf.html )
>
> If that doesn't work, you need to go back to the raw unbuffered IO, do a
> IOCTL if necessary.  FPOpen, FPClose, FPWrite, FPRead
>
> Moreover, how does lazarus deal with this?

I guess Lazarus doesn't care, as long as it gets all the information at
the end. There is no bidirectional communication between Lazarus and the
compiler.

Vincent
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Pipe buffering, accessing C-style stdin/stdout

michael.vancanneyt
In reply to this post by Ingemar Ragnemalm


On Sun, 1 Apr 2007, Ingemar Ragnemalm wrote:

>
> Dear list,
>
> I have been struggling for quite a while (that is weeks) to get proper pipe
> communication with a sublaunched program, using TProcess or straight
> pipe/fork/exec calls. This is under Mac OSX, but the problem should be similar
> under any Unix.
>
> The problem is the buffering. Using stdio, the data is stalled until the stdio
> buffers are full. This is a big problem. Two-way communication is impossible,
> and the user feedback is delayed.
>
> After a lot of googling and experimenting, I think I have managed to make it
> work, but only in C code, and I want it to run in Pascal. The key to make it
> work in C was to call setvbuf at the right time, to set the buffering mode for
> stdin/stdout. The problem with FPC is that I can't find any straightforward
> way to either get PFile-style stdin/stdout from the Text-style input/output
> (surely there is a connection?), or get the C globals.

The only call which comes close is settextbuf(). If you set it to a smaller
value, it will come close to being unbuffered. But performance will suffer
from this. You can also call flush() after every write statement.

> I have searched through the fpc and Lazarus sources after the definitions and
> possible solutions, tried all ways I can find, but have not succeeded yet. But
> surely someone else has ran into this problem?
>
> Shouldn't simply TProcess have unbuffered or line-buffering as default?

TProcess does not do any buffering. What is more, it's up to the called
application to decide whether it buffers it's output or not, and TProcess
does not have any control over that.

Michael.
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal