Change-Prozess Namen ohne änderung argv[0] in Linux
Brauche ich zum ändern der Prozess-name für mein Programm in C-Sprache.
Ich präzise, dies ist nicht der name eines Threads, die ich ändern möchte.
Ich möchte den Namen ändern, der mein Programm, aber die einzige Lösung, die ich fand, ist zu ändern Sie den Wert des argv[0]
.
Ich fand auch eine andere Lösung mit prctl(PR_SET_NAME, "newname")
, aber diese Lösung funktioniert nicht.
- mögliche Duplikate von Wie man den Namen eines Threads in Linux?
- "Die Dokumentation sagt PR_SET_NAME legt den Namen des Prozesses; aber diese Dokumentation ist falsch - es hat eigentlich die thread-Namen. Jetzt "top" und "ps -L" zeigen die thread-Namen." -- user9876 Apr 22 '09 um 17:39
- PR_SET_NAME flag unterstützt seit Linux 2.6.9
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Unterschiede zwischen aufrufen
prctl
und ändernargv[0]
sind:argv[0]
änderungen der Informationen in/proc/$pid/cmdline
prctl(PR_SET_NAME)
änderungen der Informationen in/proc/$pid/status
Dass bedeutet das man den Unterschied Namen Ihres Prozeß
ps -a
undps -ax
.Wenn Sie erwartet gleichen Prozess Namen für unterschiedliche Argumente während der Ausführung des ps, Sie können tun Sie beide (D. H., ändern
argv[0]
und aufrufenprctl
).Hoffe, die Antwort hilft.
versuchen Sie dies:
/*
erklären:
Der Speicherplatz für argv[0] könnte kleiner sein, als der name, den Sie geben wollen, und dann werden Sie overwritting einige andere unabhängige Speicher. argv[0] Größe konnte nur 2 und wenn Ihr Prozessname ist "averylongprocessname" Sie werden überlaufen argv[0]. Sie müssen strlen(argv[0]) und verwenden Sie, dass in memcpy.
thx @ecerulm
*/
strcpy
, nicht fürmemcpy
.argv[0]
, ist es wahr? So können Sie nicht haben Prozessnamen größer als der ursprüngliche nameargv[0]
könnte kleiner sein, als der name, den Sie geben wollen, und dann werden Sie overwritting einige andere unabhängige Speicher.argv[0]
Größe konnte nur 2 und wenn Ihr Prozessname ist "averylongprocessname" Sie werden überlaufenargv[0]
. Sie müssenstrlen(argv[0])
und verwenden Sie, dass inmemcpy
.\0
ist unnötig. Auchsizeof
ist falsch, hier würde es wieder die Größe eines Zeigers (in der Regel 4 oder 8 bytes). Sie möchten etwas mehr wiestrncpy(argv[0], process_name, strlen(process_name)
odermemcpy(argv[0], process_name, (strlen(argv[0]) < strlen(process_name)+1) ? strlen(argv[0]) : strlen(process_name)+1)