Golang中实现典型的fork调用

栏目: Go · 发布时间: 6年前

内容简介:Golang中没有提供

English Version

https://github.com/moby/moby/tree/master/pkg/reexec

Golang中没有提供 fork 调用,只有

这三个都类似于 fork + exec ,但是没有类似C中的fork调用,在fork之后根据返回的pid 然后进入不同的函数。原因在:

https://stackoverflow.com/questions/28370646/how-do-i-fork-a-go-process/28371586#28371586

简要翻译一下:

fork

先看一下C里的传统使用方式:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>

void child() {
    printf("child process\n");
}

int main() {
    printf("main process\n");
    pid_t pid = fork();
    int wstatus;

    if (pid == 0) {
        child();
    } else {
        printf("main exit\n");
        waitpid(pid, &wstatus, 0);
    }
}

运行一下:

$ gcc main.c && ./a.out 
main process
main exit
child process

我们看看 Docker 提供的实现的使用方式:

package main

import (
    "log"
    "os"

    "github.com/docker/docker/pkg/reexec"
)

func init() {
    log.Printf("init start, os.Args = %+v\n", os.Args)
    reexec.Register("childProcess", childProcess)
    if reexec.Init() {
        os.Exit(0)
    }
}

func childProcess() {
    log.Println("childProcess")
}

func main() {
    log.Printf("main start, os.Args = %+v\n", os.Args)
    cmd := reexec.Command("childProcess")
    cmd.Stdin = os.Stdin
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr
    if err := cmd.Start(); err != nil {
        log.Panicf("failed to run command: %s", err)
    }
    if err := cmd.Wait(); err != nil {
        log.Panicf("failed to wait command: %s", err)
    }
    log.Println("main exit")
}

跑一下:

$ go run main.go
2018/03/08 19:52:39 init start, os.Args = [/tmp/go-build209640177/b001/exe/main]
2018/03/08 19:52:39 main start, os.Args = [/tmp/go-build209640177/b001/exe/main]
2018/03/08 19:52:39 init start, os.Args = [childProcess]
2018/03/08 19:52:39 childProcess
2018/03/08 19:52:39 main exit

其原理是 init 一定会在 main 之前执行。而初次执行程序的时候 os.Args[0] 是可执行文件的名字。 但是 reexec.Command 却可以修改子进程的 os.Args[0] 。所以子进程会直接找到 reexec.Initreexec.Register 所注册的函数,然后执行,返回true。然后调用 os.Exit(0)


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

黑客秘笈

黑客秘笈

[美]彼得·基姆 / 徐文博、成明遥 / 人民邮电出版社 / 2015-7-1 / 45.00

所谓的渗透测试,就是借助各种漏洞扫描工具,通过模拟黑客的攻击方法,来对网络安全进行评估。 本书采用大量真实案例和集邮帮助的建议讲解了在渗透测试期间会面临的一些障碍,以及相应的解决方法。本书共分为10章,其内容涵盖了本书所涉的攻击机器/工具的安装配置,网络扫描,漏洞利用,人工地查找和搜索Web应用程序的漏洞,攻陷系统后如何获取更重要的信息,社工方面的技巧,物理访问攻击,规避杀毒软件的方法,破解......一起来看看 《黑客秘笈》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

MD5 加密
MD5 加密

MD5 加密工具