加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 18:23:28 所属栏目:大数据 来源:网络整理
导读:环境: linux gcc go gdb 如左边代码: go buildtest.go ./test s ./test c ./test c 可见 2 个 .dat 日志文件都有输出,说明 2 个父子进程都有 accept 成功,进一步说明 fork 在 golang 里面可用,也验证了操作系统的父子进程资源可共享 package main impor

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

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读