gpt4 book ai didi

Rust Closure 不允许访问外部数据

转载 作者:行者123 更新时间:2023-12-03 11:43:52 27 4
gpt4 key购买 nike

我正在努力在 Rust 中实现一个 Shell。我正在使用 ctrlc crate用于处理 SIGINT,我的目的是将接收到的 SIGINT 信号转发到当前在 shell 中运行的进程(前台作业):

mod jobs;


struct KSH {
jobManager: jobs::JobManager,
}

impl<'a> KSH {
fn setupSignalHandlers(&'a mut self) {
ctrlc::set_handler(move || {
sys::signal::kill(unistd::Pid::from_raw(self.jobManager.getFgJob() as i32), sys::signal::Signal::SIGINT).expect("cannot send ctrl-c")
})
.expect("Error setting Ctrl-C handler");
}
}

但我收到以下错误:
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
--> src/main.rs:55:28
|
55 | ... ctrlc::set_handler(move || {
| __________________________^
56 | | ... let pid = self.jobManager.getFgJob();
57 | | ... sys::signal::kill(unistd::Pid::from_raw(self.jobManager.getFgJob() as i32), sys::signal::Signal::SIGINT).expect("cannot send ct...
58 | | ... })
| |_______^
|
我怎样才能最好地允许这个闭包有一个适当的生命周期,以便能够访问结构数据(在这种情况下是前台作业 pid)?

最佳答案

如果您查看文档,set_handler需要 'static回调,意味着回调必须能够永远存在。
这里您的回调包括对 self 的引用。 ,这意味着它不能活得更久 self ( 'a ),这绝对不是 'static .
解决此问题的最简单方法是仅将“拥有的”数据传递给回调,例如

mod jobs;


struct KSH {
jobManager: Arc<jobs::JobManager>,
}

impl<'a> KSH {
fn setupSignalHandlers(&self) {
let jobs = Arc::clone(self.jobManager)
ctrlc::set_handler(move || {
sys::signal::kill(unistd::Pid::from_raw(jobs.getFgJob() as i32), sys::signal::Signal::SIGINT).expect("cannot send ctrl-c")
})
.expect("Error setting Ctrl-C handler");
}
}
原样, JobManager将是不可变的,因此您还需要一种同步访问的方法,例如 MutexRwLock .而且我不认为锁定是信号安全的,所以这听起来很不确定(考虑一下如果在 JobManager 被锁定时收到信号会发生什么?)。但我主要是尽量远离疯狂的信号,所以我无法真正帮助你。

关于Rust Closure 不允许访问外部数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66311055/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com