Network programming 如何从golang程序设置ulimit-n?

Network programming 如何从golang程序设置ulimit-n?,network-programming,operating-system,go,system-calls,ulimit,Network Programming,Operating System,Go,System Calls,Ulimit,我的职责是在golang程序中设置ulimit-n,这样我就不必全局设置它,而是在程序中限制它 已找到系统调用setrlimit并获取相同的rlimit。() 但是,当我尝试一个相同的示例程序时,我在设置值时遇到了一个错误,即参数无效 主程序包 进口( “fmt” “系统调用” ) func main(){ var rLimit syscall.rLimit err:=syscall.Getrlimit(syscall.RLIMIT_NOFILE,&RLIMIT) 如果错误!=零{ fmt.Pr

我的职责是在golang程序中设置ulimit-n,这样我就不必全局设置它,而是在程序中限制它

已找到系统调用setrlimit并获取相同的rlimit。()

但是,当我尝试一个相同的示例程序时,我在设置值时遇到了一个错误,即参数无效

主程序包
进口(
“fmt”
“系统调用”
)
func main(){
var rLimit syscall.rLimit
err:=syscall.Getrlimit(syscall.RLIMIT_NOFILE,&RLIMIT)
如果错误!=零{
fmt.Println(“获取Rlimit时出错”,err)
}
fmt.Println(rLimit)
rLimit.Max=999999
rLimit.Cur=999999
err=syscall.Setrlimit(syscall.RLIMIT_NOFILE,&RLIMIT)
如果错误!=零{
fmt.Println(“错误设置Rlimit”,err)
}
err=syscall.Getrlimit(syscall.RLIMIT_NOFILE,&RLIMIT)
如果错误!=零{
fmt.Println(“获取Rlimit时出错”,err)
}
fmt.Println(“Rlimit最终版”,Rlimit)
}
获得的结果是:

george@george-Not-Specified ~/work/odesk/progium/trial $ ./getRlimit 
{4294963002032703 0}
Error Setting Rlimit  invalid argument
Rlimit Final {4294963002032703 999999}
george@george-Not-Specified ~/work/odesk/progium/trial $ sudo ./getRlimit 
[sudo] password for george: 
{4294963002032703 0}
Error Setting Rlimit  invalid argument 
Rlimit Final {4294963002032703 999999}
george@george-Not-Specified ~/work/odesk/progium/trial $ uname -a
Linux george-Not-Specified 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:32:08 UTC 2012 i686 i686 i686 GNU/Linux
george@george-Not-Specified ~/work/odesk/progium/trial $ 
所以我能拿到rlimit 设置限制失败,并返回错误。 尽管失败,但当我再次获取值时,最大值已更改,但CUR值保持不变。 这个错误是由于我的内核出现了一些问题还是一个坏程序?我在哪里可以找到更多信息以及如何处理此类问题

更新:

修复完成后工作

george@george-Not-Specified ~/work/odesk/progium/trial $ go build getRlimit.go 
george@george-Not-Specified ~/work/odesk/progium/trial $ ./getRlimit 
{1024 4096}
Error Setting Rlimit  operation not permitted
Rlimit Final {1024 4096}
george@george-Not-Specified ~/work/odesk/progium/trial $ sudo ./getRlimit                                                                                               
[sudo] password for george: 
{1024 4096}
Rlimit Final {999999 999999}
george@george-Not-Specified ~/work/odesk/progium/trial $ uname -a
Linux george-Not-Specified 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:32:08 UTC 2012    i686 i686 i686 GNU/Linux
george@george-Not-Specified ~/work/odesk/progium/trial $ go version
go version devel +7c42cfa28e24 Tue Jul 30 14:22:14 2013 +1000 linux/386
它按预期工作

软限制是内核为 相应的资源。硬限制充当软限制的上限 限制:非特权进程只能将其软限制设置为某个值 在从0到硬极限的范围内,并且(不可逆地)降低其 硬限制。特权进程(在Linux下:具有 CAP_系统_资源能力)可对以下任一项进行任意更改: 极限值

rlimit.go

package main

import (
    "fmt"
    "syscall"
)

func main() {
    var rLimit syscall.Rlimit
    err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit)
    if err != nil {
        fmt.Println("Error Getting Rlimit ", err)
    }
    fmt.Println(rLimit)
    rLimit.Max = 999999
    rLimit.Cur = 999999
    err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit)
    if err != nil {
        fmt.Println("Error Setting Rlimit ", err)
    }
    err = syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit)
    if err != nil {
        fmt.Println("Error Getting Rlimit ", err)
    }
    fmt.Println("Rlimit Final", rLimit)
}
输出:

$ uname -a
Linux peterSO 3.8.0-26-generic #38-Ubuntu SMP Mon Jun 17 21:43:33 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
$ go build rlimit.go
$ ./rlimit
{1024 4096}
Error Setting Rlimit  operation not permitted
Rlimit Final {1024 4096}
$ sudo ./rlimit
[sudo] password for peterSO:
{1024 4096}
Rlimit Final {999999 999999}
更新:

我成功地为
linux/amd64
运行了
rlimit.go
,您为
linux/386
运行失败。Linux 32位发行版的
Getrlimit
Setrlimit
中都有一个bug。这些错误已经修复

使用Go
default
分支
tip
(包括错误修复),运行以下命令,并使用结果更新您的问题

$ uname -a
Linux peterSO 3.8.0-26-generic #38-Ubuntu SMP Mon Jun 17 21:46:08 UTC 2013 i686 i686 i686 GNU/Linux
$ go version
go version devel +ba52f6399462 Thu Jul 25 09:56:06 2013 -0400 linux/386
$ ulimit -Sn
1024
$ ulimit -Hn
4096
$ go build rlimit.go
$ ./rlimit
{1024 4096}
Error Setting Rlimit  operation not permitted
Rlimit Final {1024 4096}
$ sudo ./rlimit
[sudo] password for peterSO: 
{1024 4096}
Rlimit Final {999999 999999}
$ 

@正如彼得索所说,乔治霍马斯:你是以超级用户权限运行应用程序吗?@GeorgeThomas:是的。你的
uname
输出是
i686
,我的输出是
x86\u 64
。我必须设置一个32位虚拟机来完成调试。我还想知道current的值。ulimit-n返回999999,但这是不同的。@GeorgeThomas:这是一个GoLinux/386错误。我正在解决问题。@GeorgeThomas:请看我的最新答案。我已经修复了一些linux/386 Go bug。