title: How to set memory limit to a process in Golang
body: <p>I use syscall prlimit to set resource limit to process, it works for limit CPU time but when test memory usage, I come with the problem.</p>
  
  <pre><code>package sandbox
  
  import (
      "syscall"
      "unsafe"
  )
  
  func prLimit(pid int, limit uintptr, rlimit *syscall.Rlimit) error {
      _, _, errno := syscall.RawSyscall6(syscall.SYS_PRLIMIT64, uintptr(pid), limit, uintptr(unsafe.Pointer(rlimit)), 0, 0, 0)
      var err error
      if errno != 0 {
          err = errno
          return err
      } else {
          return nil
      }
  }
  </code></pre>
  
  <p>and it's my test.</p>
  
  <pre><code>func TestMemoryLimit(t *testing.T) {
      proc, err := os.StartProcess("test/memo", []string{"memo"}, &amp;os.ProcAttr{})
      if err != nil {
          panic(err)
      }
      defer proc.Kill()
      var rlimit syscall.Rlimit
      rlimit.Cur = 10
      rlimit.Max = 10 + 1024
      prLimit(proc.Pid, syscall.RLIMIT_DATA, &amp;rlimit)
      status, err := proc.Wait()
      if status.Success() {
          t.Fatal("memory test failed")
      }
  }
  </code></pre>
  
  <p>this is memo:</p>
  
  <pre><code>package main
  
  func main() {
      var a [10000][]int
      for i := 0; i &lt; 1000; i++ {
          a[i] = make([]int, 1024)
      }
  }
  </code></pre>
  
  <p>I make a large amount of memory and set only 10 bytes for the memory , but it won't signal segment fault signal any way.</p>