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

BashShellPidSubshell

Bash Problem Overview


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?

Bash Solutions


Solution 1 - Bash

$$ 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

Solution 2 - Bash

You can use one of the following.

  • $! is the PID of the last backgrounded process.
  • kill -0 $PID checks whether it's still running.
  • $$ is the PID of the current shell.

Solution 3 - Bash

  1. Parentheses invoke a subshell in Bash. Since it's only a subshell it might have the same PID - depends on implementation.
  2. The C program you invoke is a separate process, which has its own unique PID - doesn't matter if it's in a subshell or not.
  3. $$ is an alias in Bash to the current script PID. See differences between $$ and $BASHPID here, and right above that the additional variable $BASH_SUBSHELL which contains the nesting level.

Solution 4 - Bash

Try getppid() if you want your C program to print your shell's PID.

Solution 5 - Bash

this one univesal way to get correct pid

pid=$(cut -d' ' -f4 < /proc/self/stat)

same nice worked for sub

SUB(){
    pid=$(cut -d' ' -f4 < /proc/self/stat)
    echo "$$ != $pid"
}

echo "pid = $$"

(SUB)

check output

pid = 8099
8099 != 8100

Solution 6 - Bash

If you were asking how to get the PID of a known command it would resemble something like this:

If you had issued the command below #The command issued was ***

> dd if=/dev/diskx of=/dev/disky


Then you would use:

PIDs=$(ps | grep dd | grep if | cut -b 1-5)

What happens here is it pipes all needed unique characters to a field and that field can be echoed using

echo $PIDs

Solution 7 - Bash

if you want a simple shell script for getting the maximum PID with variable, do this

pid=$(cat /proc/sys/kernel/pid_max)
echo $pid

that will print you the maximum PID can be.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionruanhaoView Question on Stackoverflow
Solution 1 - BashchepnerView Answer on Stackoverflow
Solution 2 - BashcrakenView Answer on Stackoverflow
Solution 3 - BashNiels KeurentjesView Answer on Stackoverflow
Solution 4 - BashAlexView Answer on Stackoverflow
Solution 5 - BashARTEM LAPKINView Answer on Stackoverflow
Solution 6 - BashDon-Pierre HalfawayView Answer on Stackoverflow
Solution 7 - BashSertseVView Answer on Stackoverflow