小编jki*_*ski的帖子

如何在不阻塞Rust的情况下读取子进程的输出?

我正在Rust中创建一个小的ncurses应用程序,需要与子进程通信.我已经有了一个用Common Lisp编写的原型; 这里的gif 将有希望展示我想做的事情.我正在尝试重写它,因为CL为这么小的工具使用了大量的内存.

我之前没有使用过Rust(或其他低级语言),而且我在弄清楚如何与子进程交互时遇到了一些麻烦.

我目前正在做的大致是这样的:

  1. 创建流程:

    let mut program = match Command::new(command)
        .args(arguments)
        .stdin(Stdio::piped())
        .stdout(Stdio::piped())
        .stderr(Stdio::piped())
        .spawn()
    {
        Ok(child) => child,
        Err(_) => {
            println!("Cannot run program '{}'.", command);
            return;
        }
    };
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将它传递给无限(直到用户退出)循环,该循环读取并处理输入并像这样监听输出(并将其写入屏幕):

    fn listen_for_output(program: &mut Child, output_viewer: &TextViewer) {
        match program.stdout {
            Some(ref mut out) => {
                let mut buf_string = String::new();
                match out.read_to_string(&mut buf_string) {
                    Ok(_) => output_viewer.append_string(buf_string),
                    Err(_) => return,
                };
            }
            None => return,
        };
    }
    
    Run Code Online (Sandbox Code Playgroud)

read_to_string然而,调用阻止程序直到进程退出.从我所看到的read_to_end,read似乎也阻止.如果我尝试运行类似于ls哪个退出的东西,它可以工作,但是有些东西不能退出, …

io process blocking pty rust

14
推荐指数
2
解决办法
2987
查看次数

我可以将属性列表作为&键参数传递给函数吗?

是否有办法以类似于此的方式将属性列表作为参数传递给函数:

(defun sum (&key x y) (+ x y))
(sum '(:x 10 :y 20))
Run Code Online (Sandbox Code Playgroud)

common-lisp

2
推荐指数
1
解决办法
156
查看次数

用宏运行函数

我的任务是使用 do-primes计算ab之间所有素数的列表,然后使用自定义代码打印它们.

(do-primes(n 5 15)(鲜线)(princ n))应该打印4行:

  1. 7
  2. 11
  3. 13

这是我的代码:

(defun is-prime (n &optional (d (- n 1))) 
  (or (= d 1)
      (and (/= (rem n d) 0)
           (is-prime  n (- d 1)))))

(defun my-func (a b)
  (let (lst '())
    (loop for i from a to b do
      (if (is-prime i)
          (push i lst)
      )
    )
  (reverse lst))
)

(defmacro do-primes ((var startv endv) &body body)
  `(my-func ,startv ,endv) `(,@body)
) …
Run Code Online (Sandbox Code Playgroud)

common-lisp

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

标签 统计

common-lisp ×2

blocking ×1

io ×1

process ×1

pty ×1

rust ×1