Post History
Is it possible from within bar to determine [...] the process that's piping into it[?] This should be possible by searching the /proc directory. Consider the following shell session (^Z means ...
#1: Initial revision
> Is it possible from within `bar` to determine [...] the process that's piping into it[?]
This should be possible by searching the /proc directory. Consider the following shell session (^Z means that the user pressed CTRL-Z, all other lines not preceded by a dollar sign are command output.):
```
$ sleep 100 | cat
^Z
[1]+ Stopped sleep 100 | cat
$ ps
PID TTY TIME CMD
5801 pts/1 00:00:00 bash
5805 pts/1 00:00:00 sleep
5806 pts/1 00:00:00 cat
5815 pts/1 00:00:00 ps
$ readlink /proc/5805/fd/0
/dev/pts/1
$ readlink /proc/5805/fd/1
pipe:[59748]
$ readlink /proc/5806/fd/0
pipe:[59748]
$ readlink /proc/5806/fd/1
/dev/pts/1
```
This suggests that you can use the `readlink` syscall to get the number of the pipe connected to `stdin` of `bar`, and then search for processes whose `stdout` is connected to the pipe with this number.
> Is it possible from within `bar` to determine [...] whether that process is blocked on input?
I am afraid this is not possible without `ptrace`ing that process.
> I want to distinguish situations where interaction is required from situations where foo produces all its output up front and immediately exits.
You can read the whole input from `stdin`, and once you encounter `EOF`, you can be sure that `foo` won't send any more output. However, not receiving an `EOF` may indicate that `foo` is still working, not that it awaits input.
