首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GoLang(cgp)从Linux守护进程挂起http.Client get请求

GoLang(cgp)从Linux守护进程挂起http.Client get请求
EN

Stack Overflow用户
提问于 2021-05-26 19:11:34
回答 2查看 433关注 0票数 0

我编写了一个简单的GoLang函数,它使用http.Client生成HTTP请求并打印响应字符串。然后,我使用以下命令将其导出为.so文件中的C函数。

代码语言:javascript
复制
go build -o libapp.so -buildmode=c-shared libapp.go

然后使用这个.SO和.h,从我的C测试程序中导出Go函数。下面是我用来编译和构建C测试程序的命令。

代码语言:javascript
复制
gcc -o goclient goclient.c ./libapp.so

以下是CheckConnection函数在GoLang中的应用

代码语言:javascript
复制
var file io.Writer

//export CheckConnection
func 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 = f
log.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");

}

线程会在下一行被阻塞,不会超时或出现错误-

代码语言:javascript
复制
 res,err := myClient.Get("https://www.google.com")

当从守护进程调用CheckConnection()函数时,就会发生这种情况。如果我从C,C++ main()进程调用这个函数,那么它就能工作了。我也曾在GitHub https://github.com/golang/go/issues/47077上报道过同样的问题。它有再现问题的示例代码(Sample.zip)。

请参阅GitHub发布的https://github.com/golang/go/issues/47077,以获得可复制的示例代码。

在下面添加go env

代码语言:javascript
复制
GO111MODULE=""
GOARCH="386"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="386"
GOHOSTOS="linux"
GOINSECURE="golang.org,googlesource.com"
GOMODCACHE="/home/nilesh/golang/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/nilesh/golang"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_386"
GOVCS=""
GOVERSION="go1.16.4"
GCCGO="gccgo"
GO386="sse2"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/home/nilesh/SVN/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m32 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build718813889=/tmp/go-build -gno-record-gcc-switches"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-03 06:27:36

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

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

  1. 确保在链接

时没有提供共享的库名。

这解决了我的问题,我可以通过我的分叉过程进行网络呼叫。

票数 0
EN

Stack Overflow用户

发布于 2021-07-01 06:34:04

默认情况下,DefaultClient没有超时。你能尝试与自己的客户端设置超时吗?

代码语言:javascript
复制
var myClient = &http.Client{
  Timeout: time.Second * 10,
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67711312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档