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?
getpid
eine andere Prozess-ID angezeigt wird, selbst wenn sie nicht in einer Subshell ausgeführt wird.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 alsfork()
Operation implementiert .Antworten:
$$
ist definiert, um die Prozess-ID des übergeordneten Elements in einer Subshell zurückzugeben. von der Manpage unter "Spezielle Parameter":In
bash
4 können Sie die Prozess-ID des Kindes mit abrufenBASHPID
.quelle
echo $$; (echo $$; (echo $$))
die gleiche PID dreimal wieder$ Expands to the process ID of the shell
tut es das?echo $
gibt nur das wörtliche $ wieder.$
allein ist keine Parametererweiterung. Die Manpage bezieht sich auf den Namen des speziellen Parameters$
; es wird nicht behauptet, dass sich$
allein ausdehnt.echo $BASHPID
funktioniert in Bash 4 und 5 (aber nicht in Version 3.2.57 unter MacOS)Sie können eine der folgenden Optionen verwenden.
$!
ist die PID des letzten Hintergrundprozesses.kill -0 $PID
prüft, ob es noch läuft.$$
ist die PID der aktuellen Shell.quelle
kill -0 $!
wenn wir über Hintergrundprozesse sprechen?PID
ist standardmäßig auf nichts eingestellt.$$
ist ein Alias in Bash zur aktuellen Skript-PID . Sehen Sie die Unterschiede zwischen$$
und$BASHPID
hier und direkt darüber die zusätzliche Variable,$BASH_SUBSHELL
die die Verschachtelungsebene enthält.quelle
Versuchen Sie,
getppid()
ob Ihr C-Programm die PID Ihrer Shell drucken soll.quelle
Wenn Sie fragen würden, wie Sie die PID eines bekannten Befehls erhalten, würde dies ungefähr so aussehen:
Wenn Sie den folgenden Befehl ausgegeben haben #Der ausgegebene Befehl war ***
Dann würden Sie verwenden:
Was hier passiert, ist, dass alle benötigten eindeutigen Zeichen an ein Feld weitergeleitet werden und dieses Feld mit wiederholt werden kann
Echo $ PIDs
quelle
Dies ist ein einzigartiger Weg, um die richtige PID zu erhalten
pid=$(cut -d' ' -f4 < /proc/self/stat)
gleich schön gearbeitet für sub
Ausgabe prüfen
quelle