github.com/demonoid81/containerd@v1.3.4/sys/reaper_linux.go (about) 1 /* 2 Copyright The containerd Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package sys 18 19 import ( 20 "unsafe" 21 22 "golang.org/x/sys/unix" 23 ) 24 25 // If arg2 is nonzero, set the "child subreaper" attribute of the 26 // calling process; if arg2 is zero, unset the attribute. When a 27 // process is marked as a child subreaper, all of the children 28 // that it creates, and their descendants, will be marked as 29 // having a subreaper. In effect, a subreaper fulfills the role 30 // of init(1) for its descendant processes. Upon termination of 31 // a process that is orphaned (i.e., its immediate parent has 32 // already terminated) and marked as having a subreaper, the 33 // nearest still living ancestor subreaper will receive a SIGCHLD 34 // signal and be able to wait(2) on the process to discover its 35 // termination status. 36 const setChildSubreaper = 36 37 38 // SetSubreaper sets the value i as the subreaper setting for the calling process 39 func SetSubreaper(i int) error { 40 return unix.Prctl(setChildSubreaper, uintptr(i), 0, 0, 0) 41 } 42 43 // GetSubreaper returns the subreaper setting for the calling process 44 func GetSubreaper() (int, error) { 45 var i uintptr 46 47 if err := unix.Prctl(unix.PR_GET_CHILD_SUBREAPER, uintptr(unsafe.Pointer(&i)), 0, 0, 0); err != nil { 48 return -1, err 49 } 50 51 return int(i), nil 52 }