unix pid

Michael McDaniel <> wrote:
Perhaps I am misunderstanding the Erlang documentation.
Actually, no. It's the UNIX sheels you're misunderstanding.
os:cmd/1 says...
---------------------------------------------
cmd(Command) -> string()
Types:
Command = string() | atom()
Executes Command in a command shell of the target OS and returns
the result as a string.
That is, it captures the STANDARD OUTPUT of the command, just as
backquote does in the shell. So what's written to the standard output?
If I do the following from my (Linux) system prompt
$ sleep 97 &
[3] 11702
Since the Pid is returned as a string from the command prompt, I would expect the following
from within Erlang to return the Pid also, though it does not.
Much depends on what shell you run and how it is invoked.
For example, you get the [3] job number from the C shell (csh) or jsh,
but not from the Bourne shell (sh). More to the point, look at this:
f% sh
$ sleep 1 &
18399
$ (sleep 1 &)>/tmp/foo.out
$ cat /tmp/foo.out
18407
$ sh -c "sleep 10 &"
$ ps
PID TTY TIME CMD
4008 pts/6 0:06 csh
18416 pts/6 0:00 ps
18415 pts/6 0:00 sleep
18398 pts/6 0:00 sh
Did you notice where 'sh -c "<command>"' produced NO output?
Now let's try it from C:
f% cat foo.c
extern int system(char const *);
int main(void) {
(void) system("sleep 10 &");
return 0;
}
f% cc foo.c
f% a.out
f% ps
f% ps
PID TTY TIME CMD
4008 pts/6 0:06 csh
18445 pts/6 0:00 ps
18444 pts/6 0:00 sleep
Again, NO OUTPUT.
The point here is that when a shell creates another process in response
to an "&" in the command, it writes the PID (plus, in the case of csh,
the job number) if and only if it thinks there is a human being watching
the output; if it thinks a program is watching the output, the PID is
*not* written.
What's the answer? You will have to explicitly write out the process
number using $! .
$ sh -c "sleep 10 &
> echo $!"
18509
$
Or in Erlang:
1> os:cmd("sleep 10 &\necho $!").
"18525\n"