golang 使用共享内存

golang没有提供共享内存的函数,使用syscall调用,或者调用c语言的共享内存函数。

// @file main.go
// @brief
// @author tenfyzhong
// @email tenfyzhong@qq.com
// @created 2017-06-26 17:54:34
package main

import (
    "flag"
    "fmt"
    "os"
    "syscall"
    "time"
    "unsafe"
)

const (
    // IpcCreate create if key is nonexistent
    IpcCreate = 00001000
)

var mode = flag.Int("mode", 0, "0:write 1:read")

func main() {
    flag.Parse()
    shmid, _, err := syscall.Syscall(syscall.SYS_SHMGET, 2, 4, IpcCreate|0600)
    if err != 0 {
        fmt.Printf("syscall error, err: %v\n", err)
        os.Exit(-1)
    }
    fmt.Printf("shmid: %v\n", shmid)

    shmaddr, _, err := syscall.Syscall(syscall.SYS_SHMAT, shmid, 0, 0)
    if err != 0 {
        fmt.Printf("syscall error, err: %v\n", err)
        os.Exit(-2)
    }
    fmt.Printf("shmaddr: %v\n", shmaddr)

    defer syscall.Syscall(syscall.SYS_SHMDT, shmaddr, 0, 0)

    if *mode == 0 {
        fmt.Println("write mode")
        i := 0
        for {
            fmt.Printf("%d\n", i)
            *(*int)(unsafe.Pointer(uintptr(shmaddr))) = i
            i++
            time.Sleep(1 * time.Second)
        }
    } else {
        fmt.Println("read mode")
        for {
            fmt.Println(*(*int)(unsafe.Pointer(uintptr(shmaddr))))
            time.Sleep(1 * time.Second)
        }
    }
}

转载:https://studygolang.com/articles/10203

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值