Examples of concurrent coproc usage?

Carl Edquist edquist@cs.wisc.edu
Sat Apr 20 22:04:27 GMT 2024


On Wed, 17 Apr 2024, Chet Ramey wrote:

> On 4/15/24 1:01 PM, Carl Edquist wrote:
>>
>>  Yet another point brought to light by the bcalc example relates to the
>>  coproc pid variable.  The reset() function first closes the coproc
>>  pipe fds, then sleeps for a second to give the BC coproc some time to
>>  finish.
>>
>>  An alternative might be to 'wait' for the coproc to finish (likely
>>  faster than sleeping for a second).
>
> If the coproc has some problem and doesn't exit immediately, `wait' 
> without options will hang. That's why I opted for the 
> sleep/kill-as-insurance combo.

Yes that much was clear from the script itself.

I didn't mean any of that as a critique of the bcalc script.  I just meant 
it brought to light the point that the coproc pid variable is another 
thing in the current deallocate-on-terminate behavior, that needs to be 
copied before it can be used reliably.  (With the 'kill' or 'wait' 
builtins.)

Though I do suspect that the most common case with coprocs is that closing 
the shell's read and write fds to the coproc is enough to cause the coproc 
to finish promptly - as neither read attempts on its stdin nor write 
attempts on its stdout can block anymore.

I think this is _definitely_ true for the BC coproc in the bcalc example. 
But it's kind of a distraction to get hung up on that detail, because in 
the general case there may very well be other scenarios where it would be 
appropriate to, um, _nudge_ the coproc a bit with the kill command.


> (And before you ask why I didn't use `wait -n', I wrote bcalc in 30 
> minutes after someone asked me a question about doing floating point 
> math with awk in a shell script, and it worked.)

It's fine!  It's just an example, after all  :)


Carl


More information about the Libc-alpha mailing list