如何在linux下更改haskell进程的名称

时间:2014-10-30 15:57:17

标签: linux haskell

我正在尝试在linux下更改正在运行的进程的名称。在C中,我只是在原地修改argv[0],但我怎样才能从haskell那里做到这一点?我注意到ghc有一个名为getProgArgv的原语:

foreign import ccall unsafe "getProgArgv"
    getProgArgv :: Ptr CInt -> Ptr (Ptr CString) -> IO ()

但是我尝试了它并且没有用。另外,我知道prctl(PR_SET_NAME,"...")但只会更改当前线程的名称,而且大多数工具(例如pshtop)都不使用该名称。

1 个答案:

答案 0 :(得分:1)

好的,所以我想出了一个似乎有效的丑陋黑客。它基于从here借来的想法。我们必须使用辅助c文件:

#include <string.h>
#include <sys/prctl.h>

char *argv0 = 0;

static void capture_argv0(int argc, char *argv[]) {
    argv0 = argv[0];
}
__attribute__((section(".init_array"))) void (*p_capture_argv0)(int, char*[]) = &capture_argv0;

void set_prog_name(char *name) {
    if (!argv0) return;
    size_t len = strlen(argv0);
    strncpy(argv0, name, len);
    prctl(PR_SET_NAME, name);
}

这取决于section(".init_array")属性,该属性告诉gcc将capture_argv0注册为初始化函数。这意味着它将在main之前执行。我们使用它来制作argv[0]指针的副本并将其存储为全局变量。现在我们可以从haskell调用set_prog_name