亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

執行命令行二進制文件并持續讀取標準輸出

執行命令行二進制文件并持續讀取標準輸出

Go
jeck貓 2022-09-12 17:06:39
在 Go 中,我想從我的應用程序中執行一個二進制文件,并不斷讀取命令打印到 stdout 的內容。但是,需要注意的是,二進制文件被編程為無限執行其任務,直到它讀取回車鍵,而我無法訪問二進制文件的源代碼。如果我直接從終端執行二進制文件,它的行為是正確的。但是,如果我從應用程序內執行二進制文件,它會以某種方式認為它讀取了 enter 鍵,并且幾乎立即關閉。下面是一個代碼片段,演示了我如何嘗試執行二進制文件,將其標準化,然后將其打印到屏幕上:func main() {    // The binary that I want to execute.    cmd := exec.Command("/usr/lib/demoApp")    // Pipe the command's output.    stdout, err := cmd.StdoutPipe()    if err != nil {        fmt.Println(err)    }    stdoutReader := bufio.NewReader(stdout)    // Start the command.    err = cmd.Start()    if err != nil {        fmt.Println(err)    }    // Read and print the command's output.    buff := make([]byte, 1024)    var n int    for err == nil {        n, err = stdoutReader.Read(buff)        if n > 0 {            fmt.Printf(string(buff[0:n]))        }    }    _ = cmd.Wait()}任何想法,如果我試圖完成的事情是可能的?
查看完整描述

2 回答

?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

你的問題可能出在其他地方;就像也許外部依賴只是由于不在終端中運行而保釋。使用以下內容來模擬:demoApp


func main() {

    fmt.Println("Press enter to exit")

    // Every second, report fake progress

    go func() {

        for {

            fmt.Print("Doing stuff...\n")

            time.Sleep(time.Second)

        }

    }()


    for {

        // Read single character and if enter, exit.

        consoleReader := bufio.NewReaderSize(os.Stdin, 1)

        input, _ := consoleReader.ReadByte()


        // Enter = 10 | 13 (LF or CR)

        if input == 10 || input == 13 {

            fmt.Println("Exiting...")

            os.Exit(0)

        }

    }

}

...這對我來說很好:


func main() {

    cmd := exec.Command("demoApp.exe")

    stdout, err := cmd.StdoutPipe()

    if err != nil {

        panic(err)

    }


    stdin, err := cmd.StdinPipe()

    if err != nil {

        log.Fatal(err)

    }


    go func() {

        defer stdin.Close()

        // After 3 seconds of running, send newline to cause program to exit.

        time.Sleep(time.Second * 3)

        io.WriteString(stdin, "\n")

    }()


    cmd.Start()


    // Scan and print command's stdout

    scanner := bufio.NewScanner(stdout)

    for scanner.Scan() {

        fmt.Println(scanner.Text())

    }


    // Wait for program to exit.

    cmd.Wait()

}

$ go run main.go

Press enter to exit

Doing stuff...

Doing stuff...

Doing stuff...

Exiting...

這與你的代碼之間的唯一區別是,我使用stdin在3秒后發送換行符來終止cmd。也使用掃描儀為簡潔。


查看完整回答
反對 回復 2022-09-12
?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

用這個作為我的:/usr/lib/demoApp


package main


import (

   "fmt"

   "time"

)


func main() {

   for {

      fmt.Print("North East South West")

      time.Sleep(time.Second)

   }

}

此程序按預期工作:


package main


import (

   "os"

   "os/exec"

)


func main() {

   cmd := exec.Command("demoApp")

   stdout, err := cmd.StdoutPipe()

   if err != nil {

      panic(err)

   }

   cmd.Start()

   defer cmd.Wait()

   for {

      var b [1024]byte

      stdout.Read(b[:])

      os.Stdout.Write(b[:])

   }

}


查看完整回答
反對 回復 2022-09-12
  • 2 回答
  • 0 關注
  • 164 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號