github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/common/fdlimit/fdlimit_unix.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 19:16:33</date>
    10  //</624450073417224192>
    11  
    12  
    13  //+构建Linux Darwin Netbsd Openbsd Solaris
    14  
    15  package fdlimit
    16  
    17  import "syscall"
    18  
    19  //raise尝试最大化此进程的文件描述符允许量
    20  //达到操作系统允许的最大硬限制。
    21  func Raise(max uint64) error {
    22  //获取当前限制
    23  	var limit syscall.Rlimit
    24  	if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
    25  		return err
    26  	}
    27  //尝试将限额更新为最大限额
    28  	limit.Cur = limit.Max
    29  	if limit.Cur > max {
    30  		limit.Cur = max
    31  	}
    32  	if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
    33  		return err
    34  	}
    35  	return nil
    36  }
    37  
    38  //当前检索允许由此打开的文件描述符数
    39  //过程。
    40  func Current() (int, error) {
    41  	var limit syscall.Rlimit
    42  	if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
    43  		return 0, err
    44  	}
    45  	return int(limit.Cur), nil
    46  }
    47  
    48  //最大检索此进程的最大文件描述符数
    49  //允许自己请求。
    50  func Maximum() (int, error) {
    51  	var limit syscall.Rlimit
    52  	if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
    53  		return 0, err
    54  	}
    55  	return int(limit.Max), nil
    56  }
    57