'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:
- 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...
- When I use my program to show pid between parenthesis, the pid it shows is different, is it right?
- Is
$$something like macro?
Can you help me?
Solution 1:[1]
You can use one of the following.
$!is the PID of the last backgrounded process.kill -0 $PIDchecks whether it's still running.$$is the PID of the current shell.
Solution 2:[2]
- Parentheses invoke a subshell in Bash. Since it's only a subshell it might have the same PID - depends on implementation.
- 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.
$$is an alias in Bash to the current script PID. See differences between$$and$BASHPIDhere, and right above that the additional variable$BASH_SUBSHELLwhich contains the nesting level.
Solution 3:[3]
Try getppid() if you want your C program to print your shell's PID.
Solution 4:[4]
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 5:[5]
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 6:[6]
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.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | gnuanu |
| Solution 2 | Community |
| Solution 3 | Alex |
| Solution 4 | ARTEM LAPKIN |
| Solution 5 | Don-Pierre Halfaway |
| Solution 6 | SertseV |
