【问题标题】:Using prctl PR_SET_NAME to set name for process or thread?使用 prctl PR_SET_NAME 设置进程或线程的名称?
【发布时间】:2015-08-07 19:15:53
【问题描述】:

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

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

【问题讨论】:

标签: c linux multithreading process


【解决方案1】:

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

例子:

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

现在,如果您在 Linux 中运行您的进程,请输入:

top

ps

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

【讨论】:

  • 错误:这样做确实会更改进程名称,但您不会看到 PS 或 TOP 命令有任何区别。那是因为要完成您想要的,您必须更改 argv[0] ,这是这两个命令所反映的。
  • 出于好奇,您是否有理由在参数"myProcess\0" 中添加了额外的\0? C 字符串已经以 \0 结束
【解决方案2】:

试试下面的代码:

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

【讨论】:

    【解决方案3】:

    要设置进程名称,您可以像 prctl 一样使用,但这只会显示在 /proc/pid/status(以及使用它的程序)中。 ps 和 top 查看别处并更改 ps 和 top 中显示的进程名称,您必须更改 argv[0]。

    所以只需将其分配为 argv[0]="newprocessname";会的。

    【讨论】:

    • 您能添加一个示例并分享您使用的发行版和内核版本吗?更改 argv[0] 对我不起作用,但 pthread_setname_npprctl 确实起作用。
    • 正如我所说,你必须同时做这两件事。 ubuntu 16-17-18 任意内核
    猜你喜欢
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多