bashshellpidsubshell

Why is $$ returning the same id as the parent process?


I have problem with Bash, and I don't know why.
Under shell, I enter:

echo $$    ## print 2433
(echo $$)  ## also print 2433
(./getpid) ## print 2602

Where getpid is a C program to get current pid, like:

   int main() {
    printf("%d", (int)getpid());
    return 0;
   }

What confuses me is that:

  1. I think "(command)" is a sub-process (am i right?), and i think its pid should be different with its parent pid, but they are the same, why...
  2. When I use my program to show pid between parenthesis, the pid it shows is different, is it right?
  3. Is $$ something like macro?

Can you help me?


Solution

  • $$ is defined to return the process ID of the parent in a subshell; from the man page under "Special Parameters":

    $ Expands to the process ID of the shell. In a () subshell, it expands to the process ID of the current shell, not the subshell.

    In bash 4, you can get the process ID of the child with BASHPID.

    ~ $ echo $$
    17601
    ~ $ ( echo $$; echo $BASHPID )
    17601
    17634