如何将字符串/命令发送到stdin

时间:2017-07-13 19:31:57

标签: vala

在测试程序时,能够将字符串泵入stdin进行处理(VSCode 1.15.0-insider / Linux Mint 18.2上的libval​​a-0.36)会很不错。下面只是为了说明,但stdin.puts / stdin.flush似乎不起作用。如何将键击/字符串泵入stdin?

 private void test_func(){
    ...do stuff
    stdin.puts("""{"event":"server.connected","params":{"version":"0.0.1","pid":0}}""");
    ...do stuff 
    stdin.puts("exit\r\n");
 }
 public static int main (string[] args) {
    string line;
    ...do stuff 

 #if DEBUG
    test_func();
 #endif

    while ((line = stdin.read_line ()) != null) {
       line = line.strip ();
       if (line.length > 0) {
          if (line == "exit") break;
          gJsonRPC.handle_request (line);
          }
       }
    ...do stuff 
    }

更新: 没有找到类似于GLIB中的.Net“SendKeys”类的功能,所以暂时解决了这个方法....

  public static void SendKeys(string sKeys) {
     //--------------------------------------------------------------
     //OSS:Hack:SendKeys
     //--------------------------------------------------------------
     char[] _keys = sKeys.to_utf8();
     for (int i = _keys.length; i >= 0; i--)
        stdin.ungetc (_keys[i]);
     //--------------------------------------------------------------
     }

@Lasall建议FileStream.open(¨/ dev /stdin¨,¨w¨),所以我接下来试试。

1 个答案:

答案 0 :(得分:2)

GLib.stdin实际上只是一个GLib.FileStream

您可以将处理代码封装在一个采用FileStream的函数中:

public void my_processing_func (FileStream stream) {
   while ((line = stream.read_line ()) != null) {
      line = line.strip ();
      if (line.length > 0) {
         if (line == "exit") break;
         gJsonRPC.handle_request (line);
         }
      }
   }
}

然后在您的主要内容中,您可以有条件地使用您的测试数据或stdin:

#ifdef DEBUG
   var stream = test_func ();
#else
   var stream = stdin;
#endif
   my_processing_func (stream);

我可能不会使用DEBUG,但有一些更具描述性的名称,如TEST_DATA,使用正确的单元测试并编写测试程序而不是#ifdefing主程序可能更好。