加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-13 23:26:07 所属栏目:Linux 来源:网络整理
导读:我试图在 linux下更改正在运行的进程的名称.在C中,我只是就地修改argv [0],但是如何从haskell中做到这一点?我注意到ghc有一个名为getProgArgv的原语: foreign import ccall unsafe "getProgArgv" getProgArgv :: Ptr CInt - Ptr (Ptr CString) - IO () 但
我试图在 linux下更改正在运行的进程的名称.在C中,我只是就地修改argv [0],但是如何从haskell中做到这一点?我注意到ghc有一个名为getProgArgv的原语:

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

但我尝试了它,它没有用.另外,我知道prctl(PR_SET_NAME,“…”)但只更改了当前线程的名称,并且大多数工具(例如ps和htop)都不使用该名称.

解决方法

好的,所以我想出了一个似乎有效的丑陋黑客.它基于从 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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读