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

How can I replace an entry in std::env:args()?

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

env::args函数返回一个Args值。 Args值包装了特定于平台的std::sys::args::args()函数,该函数不会重新导出以用于一般用途。 ArgsOs没有可用的增变器(因此,stdlib明确表明它是不可变的)。

如何以其他方式更改参数? 我对仅Linux的解决方案感到满意,因为这是真正的工作要做的地方。 stdlib之外的解决方案也可以。

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


How can I replace an entry in std::env:args()

你不能。不可变意味着不可变。

I would like to change how my Rust program appears in top/htop

标准库中没有类似的东西。据我所知,尚无跨平台解决方案,因此要在其中进行艰苦的努力。

的Linux

似乎有一个足够简单的解决方案:在Linux中更改进程名称而不更改argv [0]

如果只关心Linux,则可以使用prctl crate:

1
prctl::set_name("new_process")

苹果系统

具有"进程名称"的各种概念,解决方案很复杂,并且使用未记录/隐藏的API:在运行时在Mac OS X上设置进程名称

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

视窗

似乎没有这样的概念:在运行时更改进程名称

跨平台

有人可以写出一个条板箱来抽象这些不同的机制,但是我不知道有哪一种。

so I can easily spot what all my threads are doing

如注释中所述,创建线程时,可以为其命名。最近在运行时将一些工作放入了重命名线程中,但是该工作停滞了。


我写了proctitle板条箱,用于以跨平台方式设置进程标题。在Linux上,确实会为当前线程命名,但这是它提供的API的一个怪癖,而不是有意选择的。