Ändern Sie den Threadnamen unter Linux (htop)

Lesezeit: 2 Minuten

Ich habe eine Multithread-Anwendung und möchte, dass htop (als Beispiel) für jeden laufenden Thread einen anderen Namen anzeigt. Im Moment zeigt es die “Befehlszeile”, die zum Ausführen des Haupt verwendet wird.

Ich habe versucht, mit

prctl(PR_SET_NAME, .....)

aber es funktioniert nur mit top und bei diesem Aufruf ist es nur möglich, Namen bis zu 16 Bytes anzugeben.

Ich denke, der Trick besteht darin, den Inhalt von /proc/PID/cmdline zu ändern, aber das ist ein schreibgeschütztes Feld.

Weiß jemand, wie man es erreicht?

Seit Version 0.8.4, htop hat eine Möglichkeit: Benutzerdefinierte Thread-Namen anzeigen

Drücken Sie F2 und wählen Sie die aus Display options Speisekarte. Das solltest du sehen:

htop benutzerdefinierte Thread-Namen

Hier müssen Sie zwischen Thread- und Pro-Prozess-Einstellung unterscheiden.

prctl(PR_SET_NAME, …) legt den Namen (bis zu 16 Bytes) pro Thread fest, und Sie können “ps” zwingen, diesen Namen mit dem Schalter c anzuzeigen (z. B. ps Hcx). Sie können dasselbe mit dem Schalter c oben tun, daher gehe ich davon aus, dass htop eine ähnliche Funktionalität hat.

Was “ps” Ihnen normalerweise anzeigt (ps Hax zum Beispiel) ist der Befehlszeilenname und die Argumente, mit denen Sie Ihr Programm gestartet haben (in der Tat, was /proc/PID/cmdline Ihnen sagt), und Sie können diese ändern, indem Sie argv direkt ändern[0] (bis zu seiner ursprünglichen Länge), aber das ist eine Einstellung pro Prozess, was bedeutet, dass Sie verschiedenen Threads auf diese Weise keine unterschiedlichen Namen geben können.

Das Folgende ist der Code, den ich normalerweise verwende, um den Prozessnamen als Ganzes zu ändern:

// procname is the new process name
char *procname = "new process name";

// Then let's directly modify the arguments
// This needs a pointer to the original arvg, as passed to main(),
// and is limited to the length of the original argv[0]
size_t argv0_len = strlen(argv[0]);
size_t procname_len = strlen(procname);
size_t max_procname_len = (argv0_len > procname_len) ? (procname_len) : (argv0_len);

// Copy the maximum
strncpy(argv[0], procname, max_procname_len);
// Clear out the rest (yes, this is needed, or the remaining part of the old
// process name will still show up in ps)
memset(&argv[0][max_procname_len], '\0', argv0_len - max_procname_len);

// Clear the other passed arguments, optional
// Needs to know argv and argc as passed to main()
//for (size_t i = 1; i < argc; i++) {
//  memset(argv[i], '\0', strlen(argv[i]));
//}

  • Warum beschränken Sie sich auf die Länge von argv[0]?

    – Benutzer2815333

    14. April 2014 um 18:04 Uhr

1204800cookie-checkÄndern Sie den Threadnamen unter Linux (htop)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy