Rust 锈封不允许访问外部数据
我正在努力实现一个生锈的外壳。我正在使用来处理SIGINT,我的目的是将接收到的SIGINT信号转发到shell中当前运行的进程(前台作业):Rust 锈封不允许访问外部数据,rust,Rust,我正在努力实现一个生锈的外壳。我正在使用来处理SIGINT,我的目的是将接收到的SIGINT信号转发到shell中当前运行的进程(前台作业): 我如何才能最好地允许此闭包具有适当的生存期,以便能够访问结构数据(在本例中为前台作业pid)?如果您查看文档,set\u handler需要一个静态回调,这意味着回调必须能够永远存在 在这里,您的回调包含对self的引用,这意味着它不能比self更长寿('a),这绝对不是静态的' 解决此问题的最简单方法是只向回调传递“拥有的”数据,例如 modjobs;
我如何才能最好地允许此闭包具有适当的生存期,以便能够访问结构数据(在本例中为前台作业pid)?如果您查看文档,
set\u handler
需要一个静态
回调,这意味着回调必须能够永远存在
在这里,您的回调包含对self
的引用,这意味着它不能比self
更长寿('a
),这绝对不是静态的'
解决此问题的最简单方法是只向回调传递“拥有的”数据,例如
modjobs;
结构KSH{
工作经理:Arc,
}
没有太多的上下文可供参考。但听起来这可能是一个使用或啊,我明白的情况。如果这是一个糟糕/愚蠢的问题,我很抱歉,但是为什么不变性需要同步原语呢?在这个实例中,所有内容都是单线程的。@user2489946在这种情况下,信号处理程序仍然可以相对于代码异步调用。
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 | | ... })
| |_______^
|