如何替换std :: env:args()中的条目?

时间:2018-01-10 18:02:05

标签: rust command-line-arguments std

我想为Rust程序中的线程提供单独的名称。这些名称应出现在top / htop中,以便我可以区分线程的工作。在Ruby中,我会修改argv[0]条目,或者Process.setproctitle("foo")。我的灵感来自Ruby的Unicorn web server

env::args函数返回Args值。 Args值包含特定于平台的std::sys::args::args()函数,该函数不会重新导出以供一般使用。 ArgsOs没有可用的mutator(所以是的,stdlib明确表示它是不可变的)。

如何以其他方式改变参数?我很满意只有Linux的解决方案,因为这是真正的工作将要发生的地方。 stdlib之外的解决方案也很好。

为了修改流程环境中的第一个参数,我应该采取什么样的路径?

2 个答案:

答案 0 :(得分:15)

  

如何替换std::env:args()

中的条目

你做不到。不可改变意味着不可改变。

  

我想更改我的Rust程序在top / htop

中的显示方式

标准库中没有这样的东西。据我所知,没有跨平台的解决方案,所以放在那里将是一场艰苦的斗争。

的Linux

似乎有一个简单的解决方案:Change process name without changing argv[0] in Linux

如果您只关心Linux,可以使用prctl包:

prctl::set_name("new_process")

MACOS

“流程名称”的各种概念和解决方案是复杂的,并使用未记录/隐藏的API:Setting process name on Mac OS X at runtime

该答案中的所有内容都可以使用适当的macOS API绑定在Rust中编写。

似乎没有这样的概念:Changing a process name in runtime

跨平台

有人可以写一个横跨这些不同机制的箱子,但我不知道。

  

所以我可以很容易地发现我的所有线程正在做什么

正如评论中所提到的,当您创建一个帖子时,您可以give it a name。最近有些工作被放入renaming threads at run time,但这项工作停滞不前。

答案 1 :(得分:2)

我写了proctitle crate以跨平台的方式设置进程标题。在Linux上,确实确实会给当前的 thread 命名,但这是它提供的API的一个怪癖,而不是故意的选择。