Ich habe ein Problem mit Bash und weiß nicht warum.
Unter Shell gebe ich ein:
echo $$ ## print 2433
(echo $$) ## also print 2433
(./getpid) ## print 2602
"getpid" ist ein C-Programm zum Abrufen der aktuellen PID, wie:
int main() { printf("%d", (int)getpid()); return 0; }
Was mich verwirrt ist:
- Ich denke, "(Befehl)" ist ein Unterprozess (habe ich Recht?), Und ich denke, seine PID sollte sich von seiner übergeordneten PID unterscheiden, aber sie sind gleich, warum ...
- Wenn ich mein Programm verwende, um pid zwischen Klammern anzuzeigen, ist die angezeigte pid anders, stimmt das?
- ist '$$' so etwas wie ein Makro?
Können Sie mir helfen?
echo $$ $BASHPID ; ( echo $$ $BASHPID )
zeigt, dass dies der Fall ist. Runde Klammern bilden eine Unterschale. Die Anweisungen können Variablenwerte ändern, und die übergeordnete Shell darf diese Änderungen nicht sehen. Dies wird als fork()
Operation implementiert .
getpid
eine andere Prozess-ID angezeigt wird, selbst wenn sie nicht in einer Subshell ausgeführt wird.