如何替换 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 server.

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

如何以其他方式改变参数?我对仅 Linux 的解决方案感到满意,因为这才是真正的工作所在。 stdlib 之外的解决方案也很好。

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

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

你不能。 Immutable 就是不可变的意思。

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

标准库中没有这样的东西。据我所知,目前还没有跨平台的解决方案,所以很难把它放在那里。

Linux

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

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

prctl::set_name("new_process")

macOS

具有 "process name" 的各种概念,解决方案很复杂并使用未记录/隐藏的 API:Setting process name on Mac OS X at runtime

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

Windows

好像没有这个概念:Changing a process name in runtime

跨平台

有人可以写一个 crate 来抽象这些不同的机制,但我不知道有一个。


so I can easily spot what all my threads are doing

如评论中所述,当您创建线程时,您可以 give it a name. Some work was recently put into renaming threads at run time,但该工作停滞了。

我写了 proctitle crate 以 cross-platform 的方式设置流程标题。在 Linux 上,它确实碰巧命名了当前的 线程 ,但这是它提供的 API 的一个怪癖,而不是有意选择。