相关疑难解决方法(0)

非阻塞getch(),ncurses

我在使用ncurses的getch()来阻止时遇到了一些问题.默认操作似乎是非阻塞的(或者我错过了一些初始化)?我希望它像Windows中的getch()一样工作.我试过各种版本的

timeout(3000000);
nocbreak();
cbreak();
noraw();
etc...
Run Code Online (Sandbox Code Playgroud)

(不是所有的同时).WINDOW如果可能的话,我宁愿不(明确地)使用任何.一个while围绕残培环路(),检查特定的返回值是OK了.

linux g++ ncurses getch blocking

22
推荐指数
3
解决办法
5万
查看次数

如何处理Rust中的阻塞i/o或一般长时间运行的外部函数调用

我需要通过Rust程序中的posix filedescriptor读取外部进程提供的数据.fd连接保持很长时间(小时),另一方不时将数据传递给我.所以我需要不断地读取和处理数据流.

为此,我编写了一个循环,调用libc::read()(实际上是readv)来读取数据并在收到数据时对其进行处理.由于这会阻塞整个调度程序,因此我在新的调度程序(readv)上生成一个任务.只要它运行,这样就可以正常工作,但我找不到一种干净地关闭循环的方法.

由于循环在大多数时间都是阻塞的,所以我不能使用port/chan来通知循环退出.

我尝试通过使用失败的链接任务将其删除来杀死循环任务(生成监督的循环任务,在其中生成链接任务并等待端口上的信号发生,然后task::spawn_sched(SingleThreaded)用它来取消循环任务) .它在测试中运行良好,但fail!()不会中断(任务在读取完成之前不会失败,并且会libc::read()在某个时间点击.

我学到了很多关于libcore来源的知识,但我似乎找不到合适的解决方案.

  1. 有没有办法在Rust中杀死(子)任务,即使它正在执行一些长时间的外部函数调用,如阻塞读取?
  2. 有没有办法在posix filedescriptor上进行非阻塞读取,以便Rust能够控制任务?
  3. 如果用户终止我的程序,我如何对信号作出反应,例如SIGTERM.task::yield()在Rust中似乎没有类似的东西吗?

io ffi task rust

16
推荐指数
1
解决办法
1819
查看次数

使用 Rust 处理管道数据标准输入

我在 Rust 中的标准输入方面遇到了问题。我正在尝试处理来自 Linux 终端上的管道的标准输入,例如 grep 之类的东西。

echo "lorem ipsum" | grep <text>
Run Code Online (Sandbox Code Playgroud)

我在 Rust 中使用这个:

fn load_stdin() -> Result<String> {
    let mut buffer = String::new();
    let stdin = stdin();
    stdin.read_line(&mut buffer)?;
    return Ok(buffer);
}
Run Code Online (Sandbox Code Playgroud)

但问题是,如果我没有引入任何管道数据,系统会提示我写入,我宁愿返回 Err。

所以基本上,如果我做类似的事情:

ls | cargo run
user@machine: ~ $ 
Run Code Online (Sandbox Code Playgroud)

一切都很好。但如果我不通过管道传输任何标准输入:

cargo run

Run Code Online (Sandbox Code Playgroud)

程序暂停并等待用户输入。

stdin rust

3
推荐指数
1
解决办法
1729
查看次数

标签 统计

rust ×2

blocking ×1

ffi ×1

g++ ×1

getch ×1

io ×1

linux ×1

ncurses ×1

stdin ×1

task ×1