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

来源:互联网 发布:mac手机铃声 编辑:程序博客网 时间:2024/06/05 15:48

环境:linux gcc go gdb

如左边代码:

go buildtest.go

./test s

./test c

./test c

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


packagemain

 

import(

    "fmt"

    "io"

    "net"

    "os"

)

 

/*

    #include<unistd.h>

    intMyFork()

    {

        pid_tp =fork();

        returnp;

    }

*/

import"C"

 

funchandlerCli(cli net.Conn){

 

    for{

        buf:= make([]byte,128)

        l,err:= cli.Read(buf)

        iferr != nil {

            fmt.Println("cli.Readerr")

        }else {

            buf= buf[:l]

            ret,e:= cli.Write(buf)

            ife != nil ||ret != l {

                fmt.Println("cli.Writeerr")

            }

        }

    }

}

funcmain() {

    varpid C.int = C.MyFork()

    ifpid != 0 {

        os.Exit(0)

    }

    ifos.Args[1] == "s" {

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

        ifserr != nil {

            fmt.Println("listenerr")

        }

        iftrue {

            C.MyFork()

        }

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

        deferfW.Close()

        varclinum int64= 0

        for{

            cli,cerr:= serv.Accept()

            ifcerr != nil {

                fmt.Println("accepterr")

                io.WriteString(fW,"accept err")

 

                continue

            }

            gohandlerCli(cli)

            clinum++

            //ifclinum%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")

        iferr != nil {

            fmt.Print(err)

            return

        }

        buf:= make([]byte,3)

        buf[0]= 'a'

        buf[1]= 'b'

        buf[2]= 'c'

        for{

            ret,ew:= cli.Write(buf)

            ifew != nil {

                fmt.Println(ew)

                continue

            }

            ifret != 3 {

                fmt.Println("writeless 3")

            }

            red,errr:= cli.Read(buf)

            ifred != 3 {

                fmt.Println("readless 3")

            }

            iferrr != nil {

                fmt.Println(errr)

            }

        }

    }

    return

}


0 0