如何向进程发送数据?

3

我想编写一个Dart服务器应用程序,与接受输入并提供输出的应用程序通信,类似于Unix工具bc。

我可以读取bc的输出,但无法向bc发送命令。以下是我的代码:

#import('dart:io');

void main() {
  var p = Process.start('bc', ["-i"]);
  var stdoutStream = new StringInputStream(p.stdout);

  stdoutStream.onLine = () => print(stdoutStream.readLine());
  p.stdin.writeString("quit\n");

  p.onExit = (exitCode) {
    print('exit code: $exitCode');
    p.close();
  };
}

当我运行它时,出现了以下错误:
Unhandled exception:
SocketIOException: writeList failed - invalid socket handle
 0. Function: '_Socket@14117cc4.writeList' url: 'dart:io' line:4808 col:48
 1. Function: '_SocketOutputStream@14117cc4._write@14117cc4' url: 'dart:io' line:4993 col:70
 2. Function: '_SocketOutputStream@14117cc4.write' url: 'dart:io' line:4969 col:29
 3. Function: '_BaseOutputStream@14117cc4.writeString' url: 'dart:io' line:5197 col:3
 4. Function: '::main' url: 'file:///var/www/html/example.dart' line:8 col:22

如果我注释掉尝试写入"quit\n"的那一行,那么程序就会运行,并且我可以看到bc的输出。

那么,我该如何让我的程序像对待服务器上的应用程序bc一样发送命令呢?

1个回答

3
问题在于你在进程正确启动之前就向标准输入写入数据。尝试使用以下方法:
#import('dart:io');

void main() {
  var p = Process.start('bc', ["-i"]);
  var stdoutStream = new StringInputStream(p.stdout);

  stdoutStream.onLine = () => print(stdoutStream.readLine());
  p.onStart = () => p.stdin.writeString("1+1\nquit\n");

  p.onExit = (exitCode) {
    print('exit code: $exitCode');
    p.close();
  };
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接