使用prctl PR_SET_NAME为进程或线程设置名称?

时间:2015-05-26 08:13:29

标签: c linux multithreading process

我正在尝试使用prctl( PR_SET_NAME, "procname", 0, 0, 0)来设置进程的名称,当我阅读有关PR_SET_NAME的Linux手册时,如果我理解正确的话,它就会设置线程的名称。

可以prctl用于设置进程名称吗?如何为进程设置名称?

3 个答案:

答案 0 :(得分:4)

是的,您可以在第一个参数中使用PR_SET_NAME,使用名称作为第二个参数来设置调用线程(或进程)的名称。 prctl成功返回0。请记住,这取决于您调用此prctl的位置。如果在进程内调用它,它将更改该进程的名称及其所有归属线程。如果在特定线程内调用它,它将只更改该线程的名称。

示例:

int s;
s = prctl(PR_SET_NAME,"myProcess\0",NULL,NULL,NULL); // name: myProcess

现在,如果您在Linux中运行流程,请键入:

top

ps

查看附加到您的进程ID的名称。

答案 1 :(得分:1)

尝试以下代码:

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

答案 2 :(得分:0)

设置您可以像使用prctl一样使用的进程名称,但只会在/ proc / pid / status(以及使用它的程序)中显示。 ps和top在其他地方查找并更改ps和top中显示的进程名称,您只需更改argv [0]。

所以只需将其指定为argv [0] =“newprocessname”;不会。