初心者のGo言語 -34- <Start>
こんにちは、kurumi-bioです。
第5回目のexecパッケージ(標準ライブラリー)の学習です。
環境
- Windows
OSバージョン:Windows11 Home 22H2
Go言語のバージョン:go version go1.20.3 windows/amd64 - Linux
OSバージョン:openSUSE Leap 15.4
Go言語のバージョン:go version go1.20.1 linux/amd64
Start関数
func (c *Cmd) Start() error
◆テストコード
package main import ( "fmt" "os" "os/exec" "time" ) func main() { c := exec.Command("./sleep.exe", "5") n := time.Now() fmt.Printf("測定開始: %1.1f 秒経過\n", time.Since(n).Seconds()) e := c.Start() fmt.Printf("Start関数後: %1.1f 秒経過\n", time.Since(n).Seconds()) if e != nil { fmt.Fprintf(os.Stderr, "error: %v\n", e) } e = c.Wait() fmt.Printf("Wait関数後: %1.1f 秒経過\n", time.Since(n).Seconds()) if e != nil { fmt.Fprintf(os.Stderr, "error: %v\n", e) } }
◆実行結果(Windows)
プログラムを実行したことで、
Cmd.Wait()
関数は、実行したコマンドが終了するまで「待つ」ことがわかりました。本体のプロセスと実行したコマンドが同時に動いていれば、 本体のプロセスの時間が経過すれば、
Cmd.Wait()
関数の待ち時間も減るか試してみます。
◆テストコード
package main import ( "fmt" "os" "os/exec" "strconv" "time" ) func main() { if len(os.Args) != 2 { fmt.Println("usage: StartTestK1.exe second") } i, _ := strconv.Atoi(os.Args[1]) t := time.Duration(i) time.Sleep(t * time.Second) c := exec.Command("./sleep.exe", "5") e := c.Start() if e != nil { fmt.Printf("error: %v\n", e) } time.Sleep(t * time.Second) n := time.Now() fmt.Printf("測定開始: %1.1f 秒経過\n", time.Since(n).Seconds()) e = c.Wait() fmt.Printf("Wait関数後: %1.1f 秒経過\n", time.Since(n).Seconds()) if e != nil { fmt.Printf("error: %v\n", e) } }
◆実行結果(Windows)
関数の説明に
c.Processフィールド
が設定されると記載されています。この
c.Processフィールド
の値を出力してみます。
◆テストコード
package main import ( "fmt" "os" "os/exec" ) func printPid(p *os.Process) { if p == nil { fmt.Println("Process is nil.") return } fmt.Printf("pid=[%d]\n", p.Pid) } func main() { c := exec.Command("./sleep.exe", "1") printPid(c.Process) e := c.Start() printPid(c.Process) if e != nil { fmt.Printf("error: %v\n", e) } e = c.Wait() printPid(c.Process) if e != nil { fmt.Printf("error: %v\n", e) } }
exec.Command()
関数、Cmd.Start()
関数およびCmd.Wait()
関数を呼んだ後にc.Process
フィールドを出力すします。もし、c.Process
がnilの場合は、"Process is nil."と出力します。
◆実行結果(Windows)
Cmd.Start()
関数を呼んだ後に、c.Process
フィールドが設定されてpidが出力されることが確認できました。
最後までご覧いただきありがとうございます