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 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题
  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能