使用 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));
}