亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Golang 中使用共享內存?

如何在 Golang 中使用共享內存?

Go
Helenr 2021-10-11 18:44:05
golang 如何共享或讀取其他進程共享內存?我查了一些資料,沒有找到相關資料。誰能給我一個例子?
查看完整描述

2 回答

?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

在 Go 的世界里,不要通過共享內存來交流;通過通信共享內存。如果你真的想試一試,你可以用 cgo 調用 C API:


包裝器.c:


#include <stdlib.h> 

#include <string.h>

#include <sys/shm.h>

#include <sys/types.h>


int my_shm_open(char* filename, int open_flag){

    int shm_id;

    key_t key;

    key = ftok(filename, 0x03);

    if(key == -1){

        return -1;

    }

    if(open_flag)

        shm_id = shmget(key, 4096, IPC_CREAT|IPC_EXCL|0600);

    else

        shm_id = shmget(key, 0, 0);

    if(shm_id == -1){

        return -1;

    }

    return shm_id;

}


int my_shm_update(int shm_id, char* content){

    char* addr;

    addr = (char*)shmat(shm_id, NULL, 0);

    if(addr == (char*)-1){

        return -1;

    }

    if(strlen(content) > 4095)

        return -1;

    strcpy(addr, content);

    shmdt(addr);

    return 0;

}


int my_shm_close(int shm_id){

    shmctl(shm_id, IPC_RMID, NULL);

    return 0;

}


char* my_shm_read(char* filename){

    int shm_id;

    char* addr;

    char* s;

    shm_id = my_shm_open(filename, 0);

    if(shm_id == -1)

        return NULL;

    addr = (char*)shmat(shm_id, NULL, 0);

    if(addr == (char*)-1){

        return NULL;

    }

    s = (char*)malloc(strlen(addr) + 1);

    strcpy(s, addr);

    shmdt(addr);

    return s;

}

閱讀器


package main


// #include <stdlib.h>

// #include "wrapper.c"

import "C"

import "unsafe"

import "fmt"


func read(filename string) string {

    f := C.CString(filename)

    defer C.free(unsafe.Pointer(f))

    s := C.my_shm_read(f)

    defer C.free(unsafe.Pointer(s))

    return C.GoString(s)

}


func main() {

    fmt.Println(read("/tmp"))

}

作家.去:


package main


// #include <stdlib.h>

// #include "wrapper.c"

import "C"

import "unsafe"


import (

    "log"

    "time"

)


type errorString struct {

    s string

}


func (e *errorString) Error() string {

    return e.s

}


func open(file string) (int, error) {

    f := C.CString(file)

    defer C.free(unsafe.Pointer(f))

    r := int(C.my_shm_open(f, C.int(1)))

    if r == -1 {

        return 0, &errorString{"error"}

    }

    return r, nil

}


func update(shm_id int, content string) error {

    c := C.CString(content)

    defer C.free(unsafe.Pointer(c))

    r := int(C.my_shm_update(C.int(shm_id), c))

    if r == -1 {

        return &errorString{"update error"}

    }

    return nil

}


func close(shm_id int) error {

    C.my_shm_close(C.int(shm_id))

    return nil

}


func main() {

    id, err := open("/tmp")

    if err != nil {

        log.Fatal(err)

    }

    defer close(id)

    err = update(id, "hello world")

    if err != nil {

        log.Fatal(err)

    }

    time.Sleep(1e9 * 100)

}

運行編寫器,然后運行閱讀器go run filename。


查看完整回答
反對 回復 2021-10-11
?
慕田峪9158850

TA貢獻1794條經驗 獲得超8個贊

golang:它是一種編程語言,所以它與操作系統級別的東西的共享內存無關。并不是說 golang 不使用共享內存,但這不是它需要定義的。posix使用共享內存,可以使用syscall包,里面包含了很多系統調用,只要參考c系統調用接口就行了。


查看完整回答
反對 回復 2021-10-11
  • 2 回答
  • 0 關注
  • 518 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號