Go语言用例

golang子进程的的标准输出和标准错误

2018-04-11  本文已影响79人  CodingCode

golang子进程的的标准输出和标准错误

使用exec.Run()运行子进程的时候,子进程的标准输入输出在哪里呢。
看下面的例子,运行主进程时,子进程sub.sh的输出会不会到屏幕(主进程的输出呢)

package main

import (
    "log"
    "os/exec"
)

func main() {
    cmd := exec.Command("./sub.sh")

    err := cmd.Run();
    if err != nil {
        log.Fatal(err)
    }
}

子进程如下:

$ cat sub.sh 
#!/bin/bash

echo "1111"
1>&2 echo "2222"

运行结果

$ ./main
$

什么也没有输出。

分析子进程的fd属性

$ ls -l /proc/<subprocesspid>/fd/
total 0
lr-x------. 1 ... 64 Apr 12 03:28 0 -> /dev/null
l-wx------. 1 ... 64 Apr 12 03:28 1 -> /dev/null
l-wx------. 1 ... 64 Apr 12 03:27 2 -> /dev/null

可以看到子进程的stdin/stdout/stderr都设置到了/dev/null所以什么也没有。

如何让它输出到屏幕呢

package main

import (
    "os"
    "log"
    "os/exec"
)

func main() {
    cmd := exec.Command("./sub.sh")
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr

    err := cmd.Run();
    if err != nil {
        log.Fatal(err)
    }
}

需要设置cmd的Stdout和Stderr,再运行我们可以看到子进程的fd属性

lr-x------. 1 ... 64 Apr 12 03:30 0 -> /dev/null
lrwx------. 1 ... 64 Apr 12 03:30 1 -> /dev/pts/12
lrwx------. 1 ... 64 Apr 12 03:30 2 -> /dev/pts/12

stdout和stderr同时指向了当前终端。

上一篇下一篇

猜你喜欢

热点阅读