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

问题描述 投票:3回答:2

我想为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外的解决方案也很好。

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

rust command-line-arguments std
2个回答
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中编写。

Windows

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

Cross-Platform

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


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

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


2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.