Golang中mips系统出现errno错误码-89是什么问题
Golang中mips系统出现errno错误码-89是什么问题 我正在使用Go语言http包的client.Do函数,但一直遇到错误。
错误码是-89,操作系统是mips 32位,因此我目前使用的是Go语言1.8版本。
由于epollcreate错误,无法使用其他更高版本。
为什么在client.Do函数中会出现错误码-89?
如果用不同的GOARCH和GOOS编译相同的源代码,它可以正常工作。
这个问题只出现在这台mips设备上。
请帮我分析一下原因。
PANIC panic: Put http://192.168.10.2:3444/conf: dial tcp 192.168.10.2 : errno -89
OS Linux TLR-2855KS 2.6.36+ #36 Wed Jul 15 16:06:23 KST 2020 mips unknown
GO VERSION go version go1.8.7 windows/amd64
Code
type REQBODY struct {
T1 string `json:"t1"`
T2 string `json:"t2"`
T3 string `json:"t3"`
T4 string `json:"t4"`
T5 string `json:"t5"`
}
func send_Request() int {
var body = REQBODY{"a", "b", "c", "d", "e"}
client := &http.Client{}
// marshal User to json
json, err := json.Marshal(body)
if err != nil {
panic(err)
}
req, err := http.NewRequest(http.MethodPut, URL, bytes.NewBuffer(json))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json; charset=utf-8")
resp, err := client.Do(req)
if err != nil {
panic(err) => PANIC!!
}
return 1
}
更多关于Golang中mips系统出现errno错误码-89是什么问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
这很可能与以下问题相同:
Cross Compiling for MIPS, runtime error
代码:
package main import “fmt” import “os/exec” func main() { out, _ := exec.Command(“date”).Output() fmt.Println(string(out)) } go version: go version go1.14.6 windows/amd64 go env: set GO111MODULE= set GOARCH=mipsle set GOBIN= set GOCACHE=C:\Users\wakoy\AppData\Local\go-build set GOENV=C:\Users\wakoy\AppData\Roaming\go\env set GOEXE= set GOFLAGS= set GOHOSTARCH=amd64 set GOHOSTOS=windows set GOINSECURE= set GONOPROXY= set GONOSUMDB= set GOOS=linux set GOPATH=C:\Users\w…
我当时的想法是,您使用的内核版本太旧,无法支持 Go 所需的功能。
我认为错误 89 表示参数中缺少源地址。
更多关于Golang中mips系统出现errno错误码-89是什么问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这是一个典型的系统调用错误码问题。错误码-89对应的是ENOSPC(No space left on device),但在网络连接场景中,这通常表示文件描述符耗尽或系统资源不足。
在MIPS架构上,这个错误通常与以下原因相关:
- 文件描述符限制:系统或进程的文件描述符达到上限
- 网络资源限制:socket创建失败
- Go 1.8在MIPS上的已知问题:早期Go版本在某些架构上的资源管理存在问题
检查当前系统的文件描述符限制:
package main
import (
"fmt"
"syscall"
)
func main() {
var rlimit syscall.Rlimit
err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlimit)
if err != nil {
fmt.Printf("获取限制失败: %v\n", err)
return
}
fmt.Printf("当前文件描述符限制: 软限制=%d, 硬限制=%d\n",
rlimit.Cur, rlimit.Max)
}
增加文件描述符限制的示例:
func increaseFileDescriptorLimit() error {
var rlimit syscall.Rlimit
err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlimit)
if err != nil {
return err
}
rlimit.Cur = 10240 // 增加到10240
rlimit.Max = 10240
return syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rlimit)
}
检查当前进程打开的文件描述符数量:
func countOpenFiles() int {
count := 0
for i := 0; i < 1024; i++ {
_, err := syscall.FcntlInt(uintptr(i), syscall.F_GETFD, 0)
if err == nil {
count++
}
}
return count
}
针对HTTP客户端,可以添加连接池管理来减少资源消耗:
func createHTTPClient() *http.Client {
transport := &http.Transport{
MaxIdleConns: 100,
MaxIdleConnsPerHost: 10,
IdleConnTimeout: 30 * time.Second,
}
return &http.Client{
Transport: transport,
Timeout: 30 * time.Second,
}
}
如果问题持续存在,可以添加详细的错误日志来追踪:
resp, err := client.Do(req)
if err != nil {
// 获取更详细的系统错误信息
if syscallErr, ok := err.(*net.OpError).Err.(*os.SyscallError); ok {
fmt.Printf("系统调用错误: %v, 错误码: %v\n",
syscallErr.Syscall, syscallErr.Err)
}
panic(err)
}
在MIPS设备上,还需要检查网络配置:
func checkNetworkConfig() {
// 检查路由表
fmt.Println("=== 路由表 ===")
data, _ := exec.Command("route", "-n").Output()
fmt.Println(string(data))
// 检查ARP缓存
fmt.Println("=== ARP缓存 ===")
data, _ = exec.Command("arp", "-a").Output()
fmt.Println(string(data))
}
这个问题在Go 1.8的MIPS架构上比较常见,建议如果可能的话,尝试使用更高版本的Go(1.10+),这些版本对MIPS架构的支持更加完善。

