本文整理汇总了Golang中syscall.Setsid函数的典型用法代码示例。如果您正苦于以下问题:Golang Setsid函数的具体用法?Golang Setsid怎么用?Golang Setsid使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了Setsid函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: PreRunService
func PreRunService() {
fmt.Println("Starting server!")
ret, _, errNo := syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
if errNo != 0 {
panic(errors.New(fmt.Sprintf("Fork failed err: %d ", errNo)))
} else {
return
}
switch ret {
case 0:
break
default:
os.Exit(0)
}
sid, err := syscall.Setsid()
utilities.CheckError(err)
if sid == -1 {
os.Exit(-1)
}
router := mux.NewRouter().StrictSlash(true)
router.HandleFunc("/", Index)
router.HandleFunc("/ls", GetFileList)
router.HandleFunc("/file", GetFile)
router.HandleFunc("/tunnel", GetTunnel)
defer log.Fatal(http.ListenAndServe(":5922", router))
fmt.Println("WTF!")
}
示例2: doChildDaemon
func doChildDaemon() {
sid, err := syscall.Setsid()
if sid < 0 || err != nil {
log.Println("Error setting sid ", err)
os.Exit(-1)
}
}
示例3: childMain
func childMain() error {
var err error
pipe := os.NewFile(uintptr(3), "pipe")
if pipe != nil {
defer pipe.Close()
if err == nil {
pipe.Write([]byte{DaemonSuccess})
} else {
pipe.Write([]byte{DaemonFailure})
}
}
signal.Ignore(syscall.SIGCHLD)
syscall.Close(0)
syscall.Close(1)
syscall.Close(2)
syscall.Setsid()
syscall.Umask(022)
// syscall.Chdir("/")
return nil
}
示例4: Reborn
// func Reborn daemonize process. Function Reborn calls ForkExec
// in the parent process and terminates him. In the child process,
// function sets umask, work dir and calls Setsid. Function sets
// for child process environment variable _GO_DAEMON=1 - the mark,
// might used for debug.
func Reborn(umask uint32, workDir string) (err error) {
if !WasReborn() {
// parent process - fork and exec
var path string
if path, err = filepath.Abs(os.Args[0]); err != nil {
return
}
cmd := prepareCommand(path)
if err = cmd.Start(); err != nil {
return
}
os.Exit(0)
}
// child process - daemon
syscall.Umask(int(umask))
if len(workDir) != 0 {
if err = os.Chdir(workDir); err != nil {
return
}
}
_, err = syscall.Setsid()
// Do not required redirect std
// to /dev/null, this work was
// done function ForkExec
return
}
示例5: Daemonize
func Daemonize() (e error) {
// var ret, err uintptr
ret, _, err := syscall.Syscall(syscall.SYS_FORK, 0, 0, 0)
if err != 0 {
return fmt.Errorf("fork error: %d", err)
}
if ret != 0 {
// Parent
os.Exit(0)
}
// We are now child
if err, _ := syscall.Setsid(); err < 0 {
return fmt.Errorf("setsid error: %d", err)
}
os.Chdir("/")
f, e := os.OpenFile(os.DevNull, os.O_RDWR, 0)
if e != nil {
return
}
fd := int(f.Fd())
syscall.Dup2(fd, int(os.Stdin.Fd()))
syscall.Dup2(fd, int(os.Stdout.Fd()))
syscall.Dup2(fd, int(os.Stderr.Fd()))
return nil
}
示例6: daemon
func daemon(nochdir, noclose int) int {
var ret, ret2 uintptr
var err syscall.Errno
darwin := runtime.GOOS == "darwin"
// already a daemon
if syscall.Getppid() == 1 {
return 0
}
// fork off the parent process
ret, ret2, err = syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
if err != 0 {
return -1
}
// failure
if ret2 < 0 {
os.Exit(-1)
}
// handle exception for darwin
if darwin && ret2 == 1 {
ret = 0
}
// if we got a good PID, then we call exit the parent process.
if ret > 0 {
os.Exit(0)
}
/* Change the file mode mask */
_ = syscall.Umask(0)
// create a new SID for the child process
s_ret, s_errno := syscall.Setsid()
if s_errno != nil {
log.Printf("Error: syscall.Setsid errno: %d", s_errno)
}
if s_ret < 0 {
return -1
}
if nochdir == 0 {
os.Chdir("/")
}
if noclose == 0 {
f, e := os.OpenFile("/dev/null", os.O_RDWR, 0)
if e == nil {
fd := f.Fd()
syscall.Dup2(int(fd), int(os.Stdin.Fd()))
syscall.Dup2(int(fd), int(os.Stdout.Fd()))
syscall.Dup2(int(fd), int(os.Stderr.Fd()))
}
}
return 0
}
示例7: daemon
func daemon(nochdir, noclose int) int {
var ret uintptr
var err syscall.Errno
ret, _, err = syscall.Syscall(syscall.SYS_FORK, 0, 0, 0)
if err != 0 {
return -1
}
switch ret {
case 0:
break
default:
os.Exit(0)
}
pid, _ := syscall.Setsid()
if pid == -1 {
return -1
}
if nochdir == 0 {
os.Chdir("/")
}
if noclose == 0 {
f, e := os.Open("/dev/null")
if e == nil {
fd := int(f.Fd())
syscall.Dup2(fd, int(os.Stdin.Fd()))
syscall.Dup2(fd, int(os.Stdout.Fd()))
syscall.Dup2(fd, int(os.Stderr.Fd()))
}
}
return 0
}
示例8: SetDaemonMode
func (this torUtil) SetDaemonMode(nochdir, noclose int) int {
if syscall.Getppid() == 1 {
return 0
}
ret, ret2, err := syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
if err != 0 {
return -1
}
if ret2 < 0 {
os.Exit(-1)
}
if ret > 0 {
os.Exit(0)
}
syscall.Umask(0)
s_ret, s_errno := syscall.Setsid()
if s_ret < 0 {
return -1
}
if nochdir == 0 {
os.Chdir("/")
}
if noclose == 0 {
f, e := os.OpenFile("/dev/null", os.O_RDWR, 0)
if e == nil {
fd := f.Fd()
syscall.Dup2(int(fd), int(os.Stdin.Fd()))
syscall.Dup2(int(fd), int(os.Stdout.Fd()))
syscall.Dup2(int(fd), int(os.Stderr.Fd()))
}
}
return 0
}
示例9: afterDaemonize
func afterDaemonize(err error) {
// Ignore SIGCHLD signal
signal.Ignore(syscall.SIGCHLD)
// Close STDOUT, STDIN, STDERR
syscall.Close(0)
syscall.Close(1)
syscall.Close(2)
// Become the process group leader
syscall.Setsid()
// // Clear umask
syscall.Umask(022)
// // chdir for root directory
syscall.Chdir("/")
// Notify that the child process started successfuly
pipe := os.NewFile(uintptr(3), "pipe")
if pipe != nil {
defer pipe.Close()
if err == nil {
pipe.Write([]byte{DAEMONIZE_SUCCESS})
} else {
pipe.Write([]byte{DAEMONIZE_FAIL})
}
}
}
示例10: Daemonize
// This function wraps application with daemonization.
// Returns isDaemon value to distinguish parent and daemonized processes.
func Daemonize() (isDaemon bool, err error) {
const errLoc = "daemonigo.Daemonize()"
isDaemon = os.Getenv(EnvVarName) == EnvVarValue
log.Println("IsDaemon: ", isDaemon)
if WorkDir != "" {
if err = os.Chdir(WorkDir); err != nil {
err = fmt.Errorf(
"%s: changing working directory failed, reason -> %s",
errLoc, err.Error(),
)
return
}
}
if isDaemon {
oldmask := syscall.Umask(int(Umask))
defer syscall.Umask(oldmask)
if _, err = syscall.Setsid(); err != nil {
err = fmt.Errorf(
"%s: setsid failed, reason -> %s", errLoc, err.Error(),
)
return
}
if pidFile, err = lockPidFile(); err != nil {
err = fmt.Errorf(
"%s: locking PID file failed, reason -> %s",
errLoc, err.Error(),
)
}
} else {
flag.Usage = func() {
arr := make([]string, 0, len(actions))
for k, _ := range actions {
arr = append(arr, k)
}
fmt.Fprintf(os.Stderr, "Usage: %s {%s}\n",
os.Args[0], strings.Join(arr, "|"),
)
flag.PrintDefaults()
}
if !flag.Parsed() {
log.Printf(" flag.Parse\n")
flag.Parse()
}
//fmt.Printf("after flag.Parse\n")
//fmt.Printf("flag.Arg(0):%s\n", flag.Arg(0))
//action, exist := actions[flag.Arg(0)]
action, exist := actions["daemon"]
//fmt.Println("exist:", exist)
if exist {
action()
} else {
flag.Usage()
}
}
return
}
示例11: _not_work_Fork
func _not_work_Fork(closeno bool) (pid int, err error) {
// don't run this
// not work with go threads
// see: http://code.google.com/p/go/issues/detail?id=227
darwin := runtime.GOOS == "darwin"
// already a daemon
if syscall.Getppid() == 1 {
return 0, nil
}
// fork off the parent process
ret, ret2, errno := syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
if errno != 0 {
return -1, fmt.Errorf("Fork failure: %s", errno)
}
// failure
if ret2 < 0 {
return -1, fmt.Errorf("Fork failure")
}
// handle exception for darwin
if darwin && ret2 == 1 {
ret = 0
}
// if we got a good PID, then we call exit the parent process.
if ret > 0 {
return 0, nil
}
// create a new SID for the child process
s_ret, s_errno := syscall.Setsid()
if s_errno != nil {
return -1, fmt.Errorf("Error: syscall.Setsid: %s", s_errno)
}
if s_ret < 0 {
return -1, fmt.Errorf("Error: syscall.Setsid: %s", s_errno)
}
if closeno {
f, e := os.OpenFile("/dev/null", os.O_RDWR, 0)
if e == nil {
fd := int(f.Fd())
syscall.Dup2(fd, int(os.Stdin.Fd()))
syscall.Dup2(fd, int(os.Stdout.Fd()))
syscall.Dup2(fd, int(os.Stderr.Fd()))
}
}
return os.Getpid(), nil
}
示例12: main
func main() {
// create a new session to prevent receiving signals from parent
syscall.Setsid()
cmd := os.Args[1]
args := os.Args[2:]
c := exec.Command(cmd, args...)
c.Stdout = os.Stdout
c.Stderr = os.Stderr
c.Start()
os.Exit(0)
}
示例13: daemon
func daemon() error {
isDarwin := runtime.GOOS == "darwin"
// already a daemon
if syscall.Getppid() == 1 {
return nil
}
// fork off the parent process
ret, ret2, errno := syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
if errno != 0 {
return errors.New(fmt.Sprintf("fork error! [errno=%d]", errno))
}
// failure
if ret2 < 0 {
os.Exit(1)
}
// handle exception for darwin
if isDarwin && ret2 == 1 {
ret = 0
}
// if we got a good PID, then we call exit the parent process.
if int(ret) > 0 {
os.Exit(0)
}
syscall.Umask(0)
// create a new SID for the child process
_, err := syscall.Setsid()
if err != nil {
return err
}
//os.Chdir("/")
f, err := os.OpenFile("/dev/null", os.O_RDWR, 0)
if err == nil {
fd := f.Fd()
syscall.Dup2(int(fd), int(os.Stdin.Fd()))
syscall.Dup2(int(fd), int(os.Stdout.Fd()))
syscall.Dup2(int(fd), int(os.Stderr.Fd()))
}
return nil
}
示例14: Exec
func (executeLinuxProcForkChildImpl *executeLinuxProcForkChildImpl) Exec(cmdLine string, dir string) error {
executeLinuxProc := executeLinuxProcStartProcessImpl{}
pid, _, errno := syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
if errno != 0 {
return syscall.Errno(errno)
}
if pid > 0 {
puid := int(pid)
processInfo, _ := os.FindProcess(puid)
if nil != processInfo {
_, err := processInfo.Wait()
if nil != err {
log.WriteLog("Error: find process %s", err.Error())
}
}
return nil
} else if pid < 0 {
return errors.New("fork error")
}
// pid1, _, errno1 := syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
// if errno1 != 0 {
// os.Exit(0)
// return errors.New("fork error")
// }
// if pid1 > 0 {
// os.Exit(0)
// return nil
// } else if pid1 < 0 {
// os.Exit(0)
// return errors.New("fork error")
// }
_ = syscall.Umask(0)
_, s_errno := syscall.Setsid()
if s_errno != nil {
log.WriteLog("Error: syscall.Setsid errno: %d", s_errno)
}
os.Chdir("/")
result := executeLinuxProc.Exec(cmdLine, dir)
os.Exit(0)
return result
}
示例15: Daemon
func Daemon(nochdir int) error {
signal.Ignore(syscall.SIGINT, syscall.SIGHUP, syscall.SIGPIPE)
if syscall.Getppid() == 1 {
return nil
}
ret1, ret2, eno := syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
if eno != 0 || ret2 < 0 {
return errors.New("Fork fail")
}
/* exit parent */
if ret1 > 0 {
os.Exit(0)
}
_ = syscall.Umask(0)
ret, err := syscall.Setsid()
if ret < 0 || err != nil {
return errors.New("Set sid failed")
}
if nochdir == 0 {
err = os.Chdir("/")
if err != nil {
return errors.New("Chdir failed")
}
}
file, err := os.OpenFile("/dev/null", os.O_RDWR, 0)
if err == nil {
fd := file.Fd()
syscall.Dup2(int(fd), int(os.Stdin.Fd()))
syscall.Dup2(int(fd), int(os.Stdout.Fd()))
// syscall.Dup2(int(fd), int(os.Stderr.Fd()))
}
return nil
}