I've never found a case where coproc actually solves a problem I'm facing.
Note that bash's version is slightly different but pretty close. Also, bash supports `lastpipe` nowadays so you don't have to use this as a workaround for that issue, and `< <()` is more often the useful thing for custom pipeline composability, and without suffering from the "only one coprocess may exist" limitation.
You can get the pid of the process in the process redirection case (`while read ...; do ...; done < <(some_program)`) but not in the | case (`some_program | while read ...; do ...; done`).
Possibly. There are race conditions with `wait` for `$somepid` because shells kinda have to reap processes as soon as possible, but that means that your `$somepid` can be stale and even refer to some other process. If you have a pipe from the process' stdout and/or stderr then when you can try to read from that pipe to know if the process exited -- you might still lose the exit status, unless you run the program like `(the_program ...; stat=$?; printf '%s\n' $stat 1>&2; exit $stat) &` and then read the exit status from the stderr pipe.
Note that bash's version is slightly different but pretty close. Also, bash supports `lastpipe` nowadays so you don't have to use this as a workaround for that issue, and `< <()` is more often the useful thing for custom pipeline composability, and without suffering from the "only one coprocess may exist" limitation.