使用 prctl PR_SET_NAME 设置进程或线程的名称?
Using prctl PR_SET_NAME to set name for process or thread?
我正在尝试使用 prctl( PR_SET_NAME, "procname", 0, 0, 0)
为进程设置名称,当我阅读关于 PR_SET_NAME 的 Linux 手册时,看起来它设置了线程的名称,如果我没看错。
prctl
可以用来设置进程名称吗?如何设置进程名称?
是的,您可以在第一个参数中使用PR_SET_NAME
,并将名称作为第二个参数来设置调用线程(或进程)的名称。 prctl
returns 0
成功。请记住,这取决于您在哪里调用此 prctl
。如果您在进程内部调用它,它将更改该进程及其所有所属线程的名称。如果您在特定线程内调用它,它只会更改该线程的名称。
示例:
int s;
s = prctl(PR_SET_NAME,"myProcess[=10=]",NULL,NULL,NULL); // name: myProcess
现在,如果您是 运行 您在 Linux 中的进程,请输入:
top
或
ps
查看附加到进程 ID 的名称。
要设置进程名称,您可以像使用 prctl 一样使用,但它只会显示在 /proc/pid/status(以及使用它的程序)中。
ps 和 top 查看其他地方并更改 ps 和 top 中显示的进程名称,您必须只更改 argv[0].
所以只需将其分配为 argv[0]="newprocessname";会的。
试试下面的代码:
const char *newName = "newname";
char *baseName;
// find application base name to correct
char *appName = const_cast<char *>(argv[0]);
if (((baseName = strrchr(appName, '/')) != NULL ||
(baseName = strrchr(appName, '\')) != NULL) && baseName[1]) {
appName = baseName + 1;
}
// Important! set new application name inside existing memory block.
// we want to avoid argv[0] = newName; because we don't know
// how cmd line buffer will be released during application shutdown phase
// Note: new process name has equal or shorter length than current argv[0]
size_t appNameLen;
if ((appNameLen = strlen(appName)) != 0) {
strncpy(appName, newName, appNameLen);
appName[appNameLen] = 0;
}
// set new current thread name
if (prctl(PR_SET_NAME, reinterpret_cast<unsigned long>(const_cast<char *>(newName)), NULL, NULL, NULL)) {
Log::error("prctl(PR_SET_NAME, \"%s\") error - %s", newName, strerror(errno));
}
我正在尝试使用 prctl( PR_SET_NAME, "procname", 0, 0, 0)
为进程设置名称,当我阅读关于 PR_SET_NAME 的 Linux 手册时,看起来它设置了线程的名称,如果我没看错。
prctl
可以用来设置进程名称吗?如何设置进程名称?
是的,您可以在第一个参数中使用PR_SET_NAME
,并将名称作为第二个参数来设置调用线程(或进程)的名称。 prctl
returns 0
成功。请记住,这取决于您在哪里调用此 prctl
。如果您在进程内部调用它,它将更改该进程及其所有所属线程的名称。如果您在特定线程内调用它,它只会更改该线程的名称。
示例:
int s;
s = prctl(PR_SET_NAME,"myProcess[=10=]",NULL,NULL,NULL); // name: myProcess
现在,如果您是 运行 您在 Linux 中的进程,请输入:
top
或
ps
查看附加到进程 ID 的名称。
要设置进程名称,您可以像使用 prctl 一样使用,但它只会显示在 /proc/pid/status(以及使用它的程序)中。 ps 和 top 查看其他地方并更改 ps 和 top 中显示的进程名称,您必须只更改 argv[0].
所以只需将其分配为 argv[0]="newprocessname";会的。
试试下面的代码:
const char *newName = "newname";
char *baseName;
// find application base name to correct
char *appName = const_cast<char *>(argv[0]);
if (((baseName = strrchr(appName, '/')) != NULL ||
(baseName = strrchr(appName, '\')) != NULL) && baseName[1]) {
appName = baseName + 1;
}
// Important! set new application name inside existing memory block.
// we want to avoid argv[0] = newName; because we don't know
// how cmd line buffer will be released during application shutdown phase
// Note: new process name has equal or shorter length than current argv[0]
size_t appNameLen;
if ((appNameLen = strlen(appName)) != 0) {
strncpy(appName, newName, appNameLen);
appName[appNameLen] = 0;
}
// set new current thread name
if (prctl(PR_SET_NAME, reinterpret_cast<unsigned long>(const_cast<char *>(newName)), NULL, NULL, NULL)) {
Log::error("prctl(PR_SET_NAME, \"%s\") error - %s", newName, strerror(errno));
}