How do I compose pipes?
Anthony
anthoq88 at gmail.com
Fri Jan 29 05:18:32 UTC 2021
On Friday, 29 January 2021 at 03:49:38 UTC, Ali Çehreli wrote:
> On 1/28/21 3:45 PM, Anthony wrote:
>
> > void end(AccumulatorPipe acc) {
> > auto pids = acc.pids ~ P.spawnShell("cat", acc.stdout);
> >
> > foreach (pid; pids) {
> > P.wait(pid);
> > }
> > }
> > ```
> >
> >
> > So now I can do something like:
> > ```
> > run("find source -name '*.d'")
> > .pipe("entr ./make.d tests")
> > .end(),
>
> Cool but there should be one improvement because I don't think
> end() is guaranteed to be executed in that code, which may
> leave zombie processes around. From 'man waitpid':
>
> "A child that terminates, but has not been waited for becomes
> a "zombie".
>
> Which is relayed to std.process documentation as "to avoid
> child processes becoming "zombies"".
>
> Ali
I take it you're referring to missing scope guards like in your
code
`scope (exit) wait(lsPid);`
Yeah, that is a tricky one. I can't think of a way to have a nice
interface that also closes the pids on exit since scope guards
are handled on function exit in this case.
Perhaps thats just the nature of the problem though.
I'll take a look at what scriptlike does
https://github.com/Abscissa/scriptlike#script-style-shell-commands
More information about the Digitalmars-d-learn
mailing list