You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的这个行为:

  1. 将Go代码编译为二进制文件:
    go build main.go
    
  2. 直接运行编译后的二进制,输出结果依然会是软限制等于硬限制——因为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:01:22