go 进程间通信

阅读更多
package main

import (
	"bytes"
	"fmt"
	"os"
	"os/exec"
	"os/signal"
	"syscall"
)

/*
 ****************************
 进程间通信
*******************************
 */
func main(){
	var pid  = os.Getpid()
	var ppid = os.Getppid()

	fmt.Printf("pid:%d\n",pid)
	fmt.Printf("ppid:%d\n",ppid)

    var sigchan = make (chan os.Signal,1)
    // signal.Notify 不按系统默认处理
    sigs := []os.Signal{syscall.SIGINT,syscall.SIGQUIT}
    signal.Notify(sigchan,sigs...)
    for sig := range sigchan {
    	fmt.Printf("Receive a signal:%s\n",sig)
    	//恢复默认处理方法
    	signal.Stop(sigchan)
	}

    //打开进程
    attr:= &os.ProcAttr{
    	Files:[]*os.File{os.Stdin,os.Stdout,os.Stderr},
	}

    p,err := os.StartProcess("C:\\Python27\\python.exe",[]string{"C:\\Python27\\python.exe","1.py"},attr)

    if  err != nil {
    	fmt.Println(err)
	}

    fmt.Println(p)
    pro,_ := os.FindProcess(p.Pid)
	fmt.Println(pro)                //&{5488 240 0}

	//杀死进程但不释放进程相关资源
	err = p.Kill()
	fmt.Println(err)

	//释放进程相关资源,因为资源释放凋之后进程p就不能进行任何操作,此后进程P的任何操作都会被报错
	err = p.Release()
	fmt.Println(err)

	//管道
	cmd1 := exec.Command("ps","aux")
	cmd2 := exec.Command("grep","apipe")

	var outputBuf1 bytes.Buffer
	cmd1.Stdout = &outputBuf1
	if err:=cmd1.Start();err!=nil {
		fmt.Printf("Erroe:the first command can not start:% %s",err)
		return
	}

	if err:=cmd1.Wait();err!=nil {
		fmt.Printf("Erroe: could not wait for the first command:% %s",err)
		return
	}

	cmd2.Stdin = &outputBuf1
	var outputBuf2 bytes.Buffer
	cmd2.Stdout = &outputBuf2
	if err:=cmd2.Start();err!=nil {
		fmt.Printf("Erroe:the second command can not start:% %s",err)
		return
	}

	if err:=cmd2.Wait();err!=nil {
		fmt.Printf("Erroe: could not wait for the second command:% %s",err)
		return
	}

	cmda := exec.Command("echo","-n","test,teste\n")
	if err:= cmda.Start(); err!=nil{
		fmt.Printf("err:%+v",err)
		return
	}

	// stdout 是 io.ReadCloser
	stdouto,err := cmda.StdoutPipe()
    if err!=nil {
		fmt.Printf("StdoutPipe err:%+v \n %+v",stdouto,err)
		return
	}

	out := make([]byte,30)
	ck,err := stdouto.Read(out)
	if err!=nil {
		fmt.Printf("stdouto.Read err:%+v",err)
		return
	}

	fmt.Printf("StdoutPipe err:%s \n",out[:ck])

}

你可能感兴趣的:(go 进程间通信)