2013-04-23 12 views
8

Potrzebuję zmodyfikować nazwę procesu mojego programu w języku C.
Dokładnie, to nie jest nazwa wątku, który chcę zmienić.
Chcę zmienić nazwę mojego programu, ale jedynym rozwiązaniem, które znalazłem, jest zmodyfikowanie wartości argv[0].
Znalazłem również inne rozwiązanie z prctl(PR_SET_NAME, "newname"), ale to rozwiązanie nie działa.Zmiana nazwy procesu bez zmiany argv [0] w systemie Linux

+0

możliwe duplikat [Jak nazwa wątku w Linux?] (Http://stackoverflow.com/questions/778085/how-to-name-a-thread-in -linux) – sehe

+0

_ "Dokumentacja mówi, że PR_SET_NAME ustawia nazwę procesu, ale ta dokumentacja jest nieprawidłowa - w rzeczywistości ustawia nazwę wątku Teraz" góra "i" ps -L "pokazują nazwę wątku." _ - [user9876 22 kwietnia 2009 o 17:39] (http://stackoverflow.com/questions/778085/how-to-name-a-thread-in-linux#comment588964_778124) – sehe

+2

Flaga PR_SET_NAME jest obsługiwana od czasu Linuksa 2.6.9 – akhil

Odpowiedz

16

Różnice między powołując prctl i modyfikować argv[0] są:

  • modyfikować argv[0] zmienia informacje w /proc/$pid/cmdline
  • powołując prctl(PR_SET_NAME) zmienia informacje w /proc/$pid/status

Oznacza to dostaniesz nazwę różnica swoje proces wydawania ps -a i ps -ax.

Jeśli spodziewasz się tej samej nazwy procesu dla różnych argumentów podczas wykonywania ps, możesz wykonać oba (tj. Zmienić argv[0] i wywołać prctl).

Mam nadzieję, że odpowiedź pomaga.

-1

spróbuj tego:

char *process_name = "aaa\0"; 
memcpy((void *)argv[0], process_name, sizeof(process_name)); 

/* wyjaśnić: Przestrzeń przeznaczona na argv [0] może być mniejsza niż imię, które chcesz dać i wtedy będzie overwritting niektóre inna niepowiązana pamięć. argv [0] rozmiar może wynosić 2, a jeśli nazwa twojego procesu to "averylongprocessname", przepełnisz argv [0]. Musisz strlen (argv [0]) i użyć tego w memcpy. thx @ecerulm

*/

+1

I myślę, że \ 0 jest niepotrzebne - czy nie jest już cicho dołączane do literału znaków? – Chap

+0

@Chap: to prawda dla 'strcpy', a nie dla' memcpy'. –

+1

Wygląda na to, że musisz nadpisać wszystkie znaki pochodzenia 'argv [0]', czy to prawda? Więc nie możesz mieć nazw procesów większych niż oryginalna nazwa. –

Powiązane problemy