2013-01-04 12 views
6

Natywna aplikacja, którą napisałem, używa zmiennej nazwy /proc/PID/status. Wydaje się jednak, że zmienna nazwy w pliku statusu jest niekompletna. Na przykład podczas testów otworzyłem kalkulator Android i sprawdziłem PID z PS i przeszedłem do odpowiedniego folderu /proc/PID. Potem kot plik statusu zobaczyćDlaczego nazwa procesu w/proc/PID/status nie pasuje do nazwy pakietu lub komendy ps

Name: oid.calculator 

Komenda PS pokazuje com.android.calculator. packages.xml pokazuje com.android.calculator. Testowałem na kilku innych telefonach (Razr Maxx z systemem 4.0.4, Google Nexus z tą samą wersją systemu operacyjnego) i zauważyłem podobne zachowanie.

Odpowiedz

11

Sprowadza się to do funkcji jądra systemu Linux: istnieją dwie różne nazwy procesu.

  • Jedna z nazw jest ostatnim elementem ścieżki do pliku wykonywalnego, np. native_executable, jeśli aplikacja znajduje się pod numerem /data/apps/com.example.hello/native_executable. Jest to nazwa, która pojawia się w polu Name z /proc/PID/status. Jądro skraca go do 15 znaków, więc w tym przypadku zawiera native_executab.
  • Druga nazwa jest przekazywana przez program, który wywołuje aplikację jako parametr wiersza polecenia nr 0 (argv[0] w języku C, args[0] w języku Java). Jest to nazwa pojawiająca się na początku /proc/PID/cmdline i wyświetlana ps.
  • Ścieżka do pliku wykonywalnego jest również celem dowiązania symbolicznego /proc/PID/exe.

Zgodnie z przyjętą konwencją, gdy program uruchamia inny, powinien używać nazwy pliku wykonywalnego jako parametru wiersza polecenia 0, ale może zdecydować inaczej. Pole Name jest zawsze ustawione na (skróconą) nazwę pliku wykonywalnego przez jądro.

Jest to ogólna funkcja systemu Linux - patrz także Can I use standard tools to get the full name of a process, when its name has embedded spaces? na Ask Ubuntu.

Aplikacja może później zmienić obie nazwy (chociaż istnieją ograniczenia długości). Dalvik używa tej możliwości do rozróżniania aplikacji: wszystkie aplikacje pochodzą z tego samego natywnego pliku wykonywalnego: /sytem/bin/app_process; zamiast pozwolić im wszystkim nazywać się app_process, maszyna wirtualna zmienia obie nazwy na nazwę pakietu aplikacji. Nazwa w /proc/PID/status jest ograniczona do 15 znaków, dlatego jest obcinana. Możesz uzyskać dłuższą nazwę od /proc/PID/cmdline (odczytaj pierwszy bajt zerowy).

+0

Doskonale dziękuję! – predhme

+0

Jaki jest powód obcięcia nazwy do 15 znaków? (TASK_COMM_LEN na 'man proc'). Wydaje się dość niski limit. –

+1

@PabloBianchi Jest przycięty, aby zachować stałą strukturę danych, co jest ważne w jądrze. Nie wiem, dlaczego rozmiar jest taki mały. – Gilles

Powiązane problemy