duanlian1320 2018-11-08 19:35
浏览 65
已采纳

Golang SIGSEGV仅在“第二次”通话中

I have a method to quickly run a shell command:

func runcmd(c string, arg ...string) (string, string, string) {
    var o bytes.Buffer
    var e bytes.Buffer
    cmd := exec.Command(c, arg...)
    cmd.Stdout = &o
    cmd.Stderr = &e
    err := cmd.Run()
    return o.String(), e.String(), err.Error()
}

In my main have the following code:

func main() {

ver, _, exitcode := runcmd("rpm", "-q", "--queryformat", "%{VERSION}", "redhat-release")
var dist string
if exitcode != "" {
    ver, _, exitcode = runcmd("rpm", "-q", "--queryformat", "%{VERSION}", "centos-release")
    if exitcode != "" {
        fmt.Println("Unknown OS! Exiting without running!")
        os.Exit(3)
    }
    dist = "CentOS"
} else {
    dist = "Redhat/Redhat derivative"
}

fmt.Printf("System is %s %s.
", dist, ver)
}

Running this produces a SIGSEGV. However, when I comment the second call to runcmd it runs as normal (returning Unknown OS! Exiting without running! exit status 3). I'm new to go so i don't really understand the nil pointer dereference error to begin with, much less why it would only happen on the second call.

  • 写回答

2条回答 默认 最新

  • douzhuo6270 2018-11-08 20:18
    关注

    You are always returning err.Error(), when there is no error (err == nil) this fails with nil pointer dereference. You should do

    func runcmd(c string, arg ...string) (string, string, error) {
      e bytes.Buffer
      cmd := exec.Command(c, arg...)
      cmd.Stdout = &o
      cmd.Stderr = &e
      err := cmd.Run()
      return o.String(), e.String(), err
    }
    

    and then

    if exitcode != nil {
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 openwrt双栈NAT
  • ¥15 部分网页页面无法显示!
  • ¥15 怎样解决power bi 中设置管理聚合,详细信息表和详细信息列显示灰色,而不能选择相应的内容呢?
  • ¥15 QTOF MSE数据分析
  • ¥15 平板录音机录音问题解决
  • ¥15 请问维特智能的安卓APP在手机上存储传感器数据后,如何找到它的存储路径?
  • ¥15 (SQL语句|查询结果翻了4倍)
  • ¥15 Odoo17操作下面代码的模块时出现没有'读取'来访问
  • ¥50 .net core 并发调用接口问题
  • ¥15 网上各种方法试过了,pip还是无法使用