美文网首页
进程学习二

进程学习二

作者: 阿猫阿狗Hakuna | 来源:发表于2020-06-07 14:46 被阅读0次

使用go进行进程编程

1.衍生(spawn)新进程

package main
import "fmt"
import "io/ioutil"
import "os/exec"
func main() {
    dateCmd := exec.Command("date")
    dateOut, err := dateCmd.Output()
    if err != nil {
        panic(err)
    }
    fmt.Println("> date")
    fmt.Println(string(dateOut))
    grepCmd := exec.Command("grep", "hello")
    grepIn, _ := grepCmd.StdinPipe()
    grepOut, _ := grepCmd.StdoutPipe()
    grepCmd.Start()
    grepIn.Write([]byte("hello grep\ngoodbye grep"))
    grepIn.Close()
    grepBytes, _ := ioutil.ReadAll(grepOut)
    grepCmd.Wait()
    fmt.Println("> grep hello")
    fmt.Println(string(grepBytes))
    lsCmd := exec.Command("bash", "-c", "ls -a -l -h")
    lsOut, err := lsCmd.Output()
    if err != nil {
        panic(err)
    }
    fmt.Println("> ls -a -l -h")
    fmt.Println(string(lsOut))
}

如果你的程序需要执行外部命令,可以直接使用exec.Command()来Spawn进程,并且根据需要获得外部程序的返回值。

2.执行(Exec)外部程序

把新程序加载到自己的内存。
与Spawn不同,执行外部程序并不会返回到原进程中,也就是让外部程序完全取代本进程。

package main

import "syscall"
import "os"
import "os/exec"

func main() {
    binary, lookErr := exec.LookPath("ls")
    if lookErr != nil {
        panic(lookErr)
    }
    args := []string{"ls", "-a", "-l", "-h"}
    env := os.Environ()
    execErr := syscall.Exec(binary, args, env)
    if execErr != nil {
        panic(execErr)
    }
}

如果你的程序就是用来执行外部程序的,例如后面提到的项目实例Run,那使用syscall.Exec执行外部程序就最合适了。注意调用该函数后,本进程后面的代码将不可能再执行了。

相关文章

网友评论

      本文标题:进程学习二

      本文链接:https://www.haomeiwen.com/subject/cszazhtx.html