Golang调用Getrlimit获取的软限制与ulimit结果不一致问题
问题原因解析
核心原因是Go运行时(Runtime)在程序启动阶段会自动将进程的文件描述符软限制提升到硬限制的数值,这是Go官方为避免程序运行中因文件描述符不足引发异常而设置的默认行为。
具体细节:
- 执行
go run main.go时,Go会先编译代码生成临时二进制,再启动该二进制进程。进程启动后,Go runtime会立即调用Setrlimit,把RLIMIT_NOFILE的软限制(Cur)设置为硬限制(Max)的值,因此代码获取到的软、硬限制数值一致。 - C程序直接继承了当前shell进程的资源限制,
ulimit -Sn查看的也是当前shell的软限制,所以两者结果一致,显示1024。
验证与补充方法
如果你想确认Go runtime的这个行为:
- 将Go代码编译为二进制文件:
go build main.go - 直接运行编译后的二进制,输出结果依然会是软限制等于硬限制——因为runtime启动时的调整逻辑和
go run完全一致。
如果需要在Go程序中获取当前shell的原始软限制,可以通过执行系统命令间接获取,示例代码:
package main import ( "fmt" "os/exec" ) func main() { out, err := exec.Command("bash", "-c", "ulimit -Sn").Output() if err != nil { panic(err) } fmt.Println("shell soft limit:", string(out)) }
内容的提问来源于stack exchange,提问作者Bo Tinker
相关产品推荐
相关产品推荐

