Mam problem z Bashem i nie wiem dlaczego.
Pod skorupą wpisuję:
echo $$ ## print 2433
(echo $$) ## also print 2433
(./getpid) ## print 2602
"getpid" to program w C do pobierania aktualnego pid, na przykład:
int main() { printf("%d", (int)getpid()); return 0; }
Co mnie wprawia w zakłopotanie, to to, że:
- Myślę, że „(polecenie)” jest podprocesem (czy mam rację?) I myślę, że jego pid powinien być inny niż jego nadrzędny pid, ale są takie same, dlaczego ...
- kiedy używam mojego programu do wyświetlania pid w nawiasach, pid, który pokazuje, jest inny, czy to prawda?
- czy „$$” przypomina makro?
Możesz mi pomóc?
getpid
że pokaże inny identyfikator procesu, nawet jeśli nie został uruchomiony w podpowłoce.echo $$ $BASHPID ; ( echo $$ $BASHPID )
udowadnia, że tak. Okrągłe nawiasy tworzą podpowłokę. Instrukcje mogą zmieniać wartości zmiennych, a powłoka nadrzędna nie może widzieć tych zmian. Jest to realizowane jakofork()
operacja.Odpowiedzi:
$$
jest zdefiniowany tak, aby zwracał identyfikator procesu rodzica w podpowłoce; ze strony podręcznika „Special Parameters”:W
bash
4 możesz uzyskać identyfikator procesu dziecka za pomocąBASHPID
.źródło
echo $$; (echo $$; (echo $$))
powtarza ten sam pid trzy razy$ Expands to the process ID of the shell
czy to mimo wszystko?echo $
po prostu powtarza dosłowne $.$
Samo nie jest rozwinięciem parametrów. Strona podręcznika odnosi się do nazwy specjalnego parametru, którym jest$
; nie twierdzi, że$
samo się rozszerza.echo $BASHPID
działa w bash 4 i 5 (ale nie w wersji 3.2.57 na MacOS)Możesz użyć jednego z poniższych.
$!
to PID ostatniego procesu w tle.kill -0 $PID
sprawdza, czy nadal działa.$$
to PID bieżącej powłoki.źródło
kill -0 $!
jeśli mówimy o procesach w tle?PID
nie jest domyślnie ustawiona na nic.$$
jest aliasem w Bash do bieżącego PID skryptu . Zobacz różnice między$$
i$BASHPID
tutaj oraz tuż nad dodatkową zmienną,$BASH_SUBSHELL
która zawiera poziom zagnieżdżenia.źródło
Spróbuj,
getppid()
jeśli chcesz, aby program C wypisał PID twojej powłoki.źródło
Gdybyś pytał, jak uzyskać PID znanego polecenia, przypominałoby to coś takiego:
Jeśli wydałeś poniższe polecenie # Wydane polecenie to ***
Wtedy użyłbyś:
To, co się tutaj dzieje, to potokowanie wszystkich potrzebnych unikalnych znaków do pola i to pole może być powtórzone przy użyciu
echo $ PIDs
źródło
to jedyny sposób na uzyskanie prawidłowego pid
pid=$(cut -d' ' -f4 < /proc/self/stat)
to samo fajne pracowało dla sub
sprawdź wyjście
źródło