golang fork 系统资源共享可行性验证

wt123379493 · · 2102 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

环境:linux gcc go gdb

如左边代码:

go buildtest.go

./test s

./test c

./test c

可见2.dat 日志文件都有输出,说明2个父子进程都有accept 成功,进一步说明fork golang里面可用,也验证了操作系统的父子进程资源可共享


package main

 

import (

    "fmt"

    "io"

    "net"

    "os"

)

 

/*

    #include <unistd.h>

    int MyFork()

    {

        pid_t p = fork();

        return p;

    }

*/

import "C"

 

func handlerCli(cli net.Conn){

 

    for {

        buf := make([]byte, 128)

        l,err := cli.Read(buf)

        if err != nil {

            fmt.Println("cli.Readerr")

        } else {

            buf = buf[:l]

            ret,e := cli.Write(buf)

            if e != nil || ret != l {

                fmt.Println("cli.Writeerr")

            }

        }

    }

}

func main() {

    var pid C.int = C.MyFork()

    if pid != 0 {

        os.Exit(0)

    }

    if os.Args[1] == "s" {

        serv,serr := net.Listen("tcp4", "127.0.0.1:8082")

        if serr != nil {

            fmt.Println("listenerr")

        }

        if true {

            C.MyFork()

        }

        fW,_ := os.OpenFile(fmt.Sprintf("%d.dat", os.Getpid()),os.O_APPEND|os.O_CREATE|os.O_RDWR, 0666)

        defer fW.Close()

        var clinum int64 = 0

        for {

            cli,cerr := serv.Accept()

            if cerr != nil {

                fmt.Println("accepterr")

                io.WriteString(fW,"accept err")

 

                continue

            }

            go handlerCli(cli)

            clinum++

            //if clinum%100 == 0 {

            //fmt.Println(os.Getpid(),":",clinum)

            io.WriteString(fW,fmt.Sprintf("%d", clinum))

            //}

        }

    } else {

        cli,err := net.Dial("tcp4", "127.0.0.1:8082")

        if err != nil {

            fmt.Print(err)

            return

        }

        buf := make([]byte, 3)

        buf[0]= 'a'

        buf[1]= 'b'

        buf[2]= 'c'

        for {

            ret,ew := cli.Write(buf)

            if ew != nil {

                fmt.Println(ew)

                continue

            }

            if ret != 3 {

                fmt.Println("writeless 3")

            }

            red,errr := cli.Read(buf)

            if red != 3 {

                fmt.Println("readless 3")

            }

            if errr != nil {

                fmt.Println(errr)

            }

        }

    }

    return

}



有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:wt123379493

查看原文:golang fork 系统资源共享可行性验证

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2102 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传