2013-02-10 39 views
1

我想用vala來啓動一個外部應用程序,使用GLib和spawn_command_line_sync()。 根據文檔(http://valadoc.org/#!api=glib-2.0/GLib.Process.spawn_sync),您可以傳遞一個字符串來存儲外部應用程序的輸出。重定向輸出以glib開頭的外部應用程序

雖然這工作正常,當啓動腳本打印幾行,我需要調用一個程序,將打印二進制文件的內容。我有什麼辦法可以接收外部程序的輸出不是在一個字符串,但在一個DataStream或類似的東西?有沒有什麼辦法可以接收外部程序的輸出不是在一個字符串,但在一個DataStream或類似的東西?我打算把外部程序的輸出寫到一個文件中,所以只需調用「cat/usr/bin/apt-get> outputfile」就可以替代(不是很好),但它不會「 t似乎工作。

無論如何,我寧願它得到某種輸出流。 我將不勝感激任何幫助。使用

代碼IM:

using GLib; 

static void main(string[] args) { 
    string execute = "cat /usr/bin/apt-get"; 
    string output = "out"; 

    try { 
     GLib.Process.spawn_command_line_sync(execute, out output); 
    } catch (SpawnError e) { 
     stderr.printf("spawn error!"); 
     stderr.printf(e.message); 
    } 

    stdout.printf("Output: %s\n", output); 
} 

回答

2

GLib.Process.spawn_async_with_pipes可以讓你做到這一點。它產生進程併爲stdoutstderrstdin中的每一個返回文件描述符。 ValaDoc中有一個代碼示例,介紹如何設置IOChannel來監視輸出。

1

謝謝你,我必須重讀spawn_async_with_pipes()返回ints而不是字符串。

這樣做有什麼問題嗎? (除1緩衝區大小)

using GLib; 

static void main(string[] args) { 

    string[] argv = {"cat", "/usr/bin/apt-get"}; 
    string[] envv = Environ.get(); 
    int child_pid; 
    int child_stdin_fd; 
    int child_stdout_fd; 
    int child_stderr_fd; 

    try { 
     Process.spawn_async_with_pipes(
      ".", 
      argv, 
      envv, 
      SpawnFlags.SEARCH_PATH, 
      null, 
      out child_pid, 
      out child_stdin_fd, 
      out child_stdout_fd, 
      out child_stderr_fd); 

    } catch (SpawnError e) { 
     stderr.printf("spawn error!"); 
     stderr.printf(e.message); 
     return; 
    } 

    FileStream filestream1 = FileStream.fdopen(child_stdout_fd, "r"); 
    FileStream filestream2 = FileStream.open("./stdout", "w"); 

    uint8 buf[1]; 
    size_t t; 
    while ((t = filestream1.read(buf, 1)) != 0) { 
     filestream2.write(buf, 1); 
    } 
} 
+1

無可厚非,但你應該叫'waitpid'或添加一個'ChildWatch'到您的主循環,這樣就可以收集你的孩子的存在狀態。如果沒有,它會變成殭屍,直到你退出並且它被'init'重新獲得並收割。 – apmasell 2013-02-10 23:15:27

+0

您可能需要考慮使用GLib.OutputStream.splice(在gio-2.0中)。 – nemequ 2013-02-10 23:18:57

相關問題