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

如何在linux下更改haskell进程的名称,第1张

概述我试图在 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.

总结

以上是内存溢出为你收集整理的如何在linux下更改haskell进程的名称全部内容,希望文章能够帮你解决如何在linux下更改haskell进程的名称所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/yw/1019739.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存