为了账号安全,请及时绑定邮箱和手机立即绑定

GoLang(cgp) http.客户端从 Linux 守护进程获取请求挂起

GoLang(cgp) http.客户端从 Linux 守护进程获取请求挂起

Go
子衿沉夜 2022-09-05 09:16:01
我写了一个简单的GoLang函数,它使用http发出HTTP GET请求。客户端并打印响应字符串。然后,我使用以下命令将其导出为.so文件中的C函数。go build -o libapp.so -buildmode=c-shared libapp.go然后使用这个.SO 和 .h,从我的 C 测试程序中调用导出的 Go 函数。以下是我用来编译和构建C测试程序的命令。gcc -o goclient goclient.c ./libapp.so这是GoLang中的CheckConnection功能var file io.Writer//export CheckConnectionfunc CheckConnection() {path := "/opt/logs/gologs.txt"f, err := os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)if err != nil {    log.Fatal(err)    }file = flog.SetOutput(file)log.Print("---------Logging started---------")log.Print("Hello from CheckConnection\r\n")log.Print("CheckConnection creating http.Client: step1")var netTransport = &http.Transport{  Dial: (&net.Dialer{Timeout: 10 * time.Second,  }).Dial,  TLSHandshakeTimeout: 10 * time.Second,    }log.Print("CheckConnection creating http.Client: step2")var myClient = &http.Client{  Timeout: time.Second * 10,  Transport: netTransport,}log.Print("CheckConnection creating http.Client: step3")res,err := myClient.Get("https://www.google.com")log.Print("CheckConnection creating http.Client: step4")if err!= nil {log.Print("Error ",err)}log.Print("CheckConnection creating http.Client: step5")data,_ := ioutil.ReadAll(res.Body)log.Print("CheckConnection creating http.Client: step6")res.Body.Close()log.Print("CheckConnection creating http.Client: step7")log.Print("Resp code ",res.StatusCode)log.Print("Data ",data)defer log.Print("Returning from CheckConnection");}线程在行下方被阻塞,不超时或给出错误 - res,err := myClient.Get("https://www.google.com")当 CheckConnection() 函数从守护进程调用时,就会发生这种情况。如果我从C,C++main()进程调用这个函数,那么它就可以工作了。我在GitHub上报告了同样的问题 https://github.com/golang/go/issues/47077。它具有重现问题的示例代码(示例.zip)。有关可重现的示例代码,请参阅 GitHub 问题 https://github.com/golang/go/issues/47077。
查看完整描述

2 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

默认情况下,默认客户端没有超时。您可以尝试使用设置了超时的自己的客户端吗?

var myClient = &http.Client{
  Timeout: time.Second * 10,
}


查看完整回答
反对 回复 2022-09-05
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

在 Linux 上的 C/C++ 程序中使用 cgp 共享库时,如果您从分叉进程调用这些函数,请确保您应该考虑以下几点。

  1. 不要静态链接共享库,而是使用 dlopen、dlsym、dlclose 动态加载它。

  2. 确保在执行上述操作时,您在链接期间未提供共享库名称

这解决了我的问题,我能够从我的分叉进程进行网络调用。


查看完整回答
反对 回复 2022-09-05
  • 2 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号