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

前端之家收集整理的这篇文章主要介绍了golang fork 系统资源共享可行性验证前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

环境: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

}

原文链接:https://www.f2er.com/go/189150.html

猜你在找的Go相关文章