Ich habe ein Problem mit Bash und ich 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, dass:
Können Sie mir helfen?
$$
gibt die Prozess-ID des übergeordneten Elements in einer Subshell zurück. von der Manpage unter "Special Parameters":
$ Wird auf die Prozess-ID der Shell erweitert. In einer () - Subshell wird die Prozess-ID der aktuellen Shell und nicht der Subshell angegeben.
In bash
4 können Sie die Prozess-ID des untergeordneten Objekts mit BASHPID
abrufen.
~ $ echo $$
17601
~ $ ( echo $$; echo $BASHPID )
17601
17634
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.$$
ist ein Alias in Bash to die aktuelle Skript-PID . Siehe nterschiede zwischen $$
und $BASHPID
hier und rechts darüber die zusätzliche Variable $BASH_SUBSHELL
, das die Verschachtelungsebene enthält.Versuchen Sie getppid()
, wenn Ihr C-Programm die PID Ihrer Shell drucken soll.
Wenn Sie sich fragen, wie die PID eines bekannten Befehls ermittelt werden soll, sieht sie ungefähr so aus:
Wenn Sie den folgenden Befehl eingegeben haben: #Der eingegebene Befehl war ***
dd if =/dev/diskx von =/dev/disky
Dann würden Sie verwenden:
PIDs=$(ps | grep dd | grep if | cut -b 1-5)
Was hier passiert, ist, dass alle benötigten eindeutigen Zeichen an ein Feld weitergeleitet werden und dieses Feld mit Echo wiedergegeben werden kann
echo $ PIDs
dies ist ein einzigartiger Weg, um die richtige PID zu erhalten
pid=$(cut -d' ' -f4 < /proc/self/stat)
selbe Nice arbeitete für sub
SUB(){
pid=$(cut -d' ' -f4 < /proc/self/stat)
echo "$$ != $pid"
}
echo "pid = $$"
(SUB)
ausgang prüfen
pid = 8099
8099 != 8100