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

标签 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没有可用的修改器(所以是的,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")

苹果操作系统

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

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

window

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

跨平台

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


so I can easily spot what all my threads are doing

如评论中所述,创建线程时,可以give it a name .一些工作最近投入了renaming threads at run time ,但这项工作停滞不前。

关于rust - 如何替换 std::env:args() 中的条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48193529/

相关文章:

generics - 特征对象如何使用通用方法作为参数来接受特征?

rust - ptr::copy::<u8>(src as *const u8, dst as *mut u8, size_of::<T>()) 和 ptr::copy::<T>(src, dst, 1) 是否有相同的性能?

python - 如何使用 bash 命令结果作为 python 参数?

具有函数调用的 C++ 三元运算符

arrays - 在 GoLang 和 Rust 中初始化字符串数组

Rust:将 JSON 数组反序列化为一个非常简单的自定义表

mysql - 从命令行将 MySQL 变量传递给脚本

python - Python 中的 subprocess() 参数

c++ - 尝试使用 main 运行类时出错

C++ template double std::complex<double> 范数和积