如何与 Golang 使用共享内存? [关闭]

     2023-02-16     122

关键词:

【中文标题】如何与 Golang 使用共享内存? [关闭]【英文标题】:how to use share memory with Golang? [closed] 【发布时间】:2015-06-08 09:22:09 【问题描述】:

golang如何共享或读取其他进程共享内存? 我查了一些资料,但没有找到相关资料。谁能举个例子?

【问题讨论】:

也许您正在寻找内存映射文件? 【参考方案1】:

在围棋的世界里,不要通过共享内存来交流;通过通信共享内存。如果你真的想试试,可以用cgo调用C API:

wrapper.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;

reader.go

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"))

writter.go:

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。 代码来自here

【讨论】:

【参考方案2】:

golang:它是一种编程语言,所以它与操作系统级别的东西的共享内存无关。不是说golang不使用共享内存,但这不是它需要定义的。 posix使用共享内存,可以使用syscall包,里面包含很多系统调用,只要引用c系统调用接口就行了。

【讨论】:

与linux和windows c++兼容的共享内存库[关闭]

...可以同时处理linux和windows平台的共享内存库。我想通过C++使用它。如果您知道,请告诉我。【问题讨论】:【参考方案1】:试试boostsharedmemory-这是跨平 查看详情

如何创建一个新进程并使用共享内存与之通信

】如何创建一个新进程并使用共享内存与之通信【英文标题】:Howtocreateanewprocessandcommunicatewiththatusingsharedmemory【发布时间】:2011-08-2418:14:21【问题描述】:您好,我正在尝试创建一个应用程序1,它接受输入数据“helloworld”。我... 查看详情

仅使用本机 C++ 操作为多个进程创建共享内存? [关闭]

...ations?[closed]【发布时间】:2013-05-1812:45:18【问题描述】:如何仅使用本机C++操作来分配可从多个进程访问的共享内存?或者我应该像在互斥锁和信号量等线程间同步对象的情况下那样使用我的操作系统API?(我的意思是你不能 查看详情

在 Linux 中使用 iprm 删除共享内存失败 [关闭]

】在Linux中使用iprm删除共享内存失败[关闭]【英文标题】:DeletesharedmemorywithiprminLinuxfails[closed]【发布时间】:2015-09-1823:08:09【问题描述】:我正在使用共享内存,并且正在测试内存引用溢出。我的代码有一些问题,我无法删除所... 查看详情

在 golang 中如何使用切片进行复制? [关闭]

】在golang中如何使用切片进行复制?[关闭]【英文标题】:Howdoescopywithslicesworkingolang?[closed]【发布时间】:2021-09-1100:58:21【问题描述】:我有一个切片,我使用copy方法将切片复制到另一个切片,我不确定如何获得以下程序的以下... 查看详情

golang协程与通道---下(代码片段)

GoLang协程与通道---下新旧模型对比:任务和worker惰性生成器的实现实现Futures模式复用典型的客户端/服务器(C/S)模式卸载(Teardown):通过信号通道关闭服务器限制同时处理的请求数在多核心上并行计算... 查看详情

如何使用 mmap 在用户空间和内核之间共享内存并且数据没有文件支持

】如何使用mmap在用户空间和内核之间共享内存并且数据没有文件支持【英文标题】:Howtosharememorybetweenuserspaceandkernelusingmmapandthedataisnotbackedbyafile【发布时间】:2014-07-2912:44:02【问题描述】:如何在没有文件支持的用户空间和内... 查看详情

如何设置linux的共享内存

在Linux中设置共享内存的方法有很多种,下面是一种常用的方法:使用shmget()函数创建一块共享内存,可以指定共享内存的大小和标识符。使用shmat()函数将共享内存连接到进程的地址空间,返回指向共享内存的指针。使用shmdt()函... 查看详情

共享内存原理与使用(代码片段)

共享内存是SystemV版本的最后一个进程间通信方式。共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的... 查看详情

golang初体验-channel

channel分为两种:1.无缓冲channel2.缓冲channel 无缓冲channel的使用必须遵循一个原则:推送和读取必须同时存在,否则就发生死锁先上代码:这里定义了一个int型的信道c1,然后通过辅助协程并行给c1推送v(就是i)然后又在主协... 查看详情

共享内存段与共享内存对象

...布时间】:2013-10-0216:26:12【问题描述】:共享内存对象(使用shm_open创建)和共享内存段(shmget)有什么区别?它们有没有像共享内存shmmax和shmall一样无法调整的限制?这两者之间是否存在任何性能差异,应在哪些IPC场景中使用... 查看详情

如何在 Ada 中使用 Linux 将任意字符串写入并读取到共享内存?

】如何在Ada中使用Linux将任意字符串写入并读取到共享内存?【英文标题】:HowdoIwriteandthenreadanarbitrarystringtosharedmemoryusingLinuxinAda?【发布时间】:2018-08-0616:56:37【问题描述】:我是Ada的初学者,网上的大部分资源都是C语言的,我... 查看详情

golang协程与通道---中(代码片段)

...0c;接收者永远不会需要。继续看示例goroutine2.go:我们如何在通道的sendData()完成的时候发送一个信号,getData()又如何检测到通道是否关闭或阻塞?第一个可以通过函数close(ch)来完成:这个将通道标记为无法通过发... 查看详情

使用与 php 和 c 的共享内存?

】使用与php和c的共享内存?【英文标题】:usingsharedmemorywithphpandc?【发布时间】:2009-03-2509:04:38【问题描述】:windows中php脚本和c程序可以使用共享内存进行通信吗?c程序一直运行并使用内存映射文件,即:handle1=CreateFileMapping((... 查看详情

Python多进程共享内存与使用参数

】Python多进程共享内存与使用参数【英文标题】:Pythonmultiprocesssharememoryvsusingarguments【发布时间】:2015-05-0521:26:34【问题描述】:我正试图弄清楚在不同进程之间共享相同数据源的最有效且内存消耗更少的方法是什么。想象一下... 查看详情

将共享内存与矩阵一起使用

】将共享内存与矩阵一起使用【英文标题】:Usingsharedmemorywithmatrices【发布时间】:2013-05-0415:26:36【问题描述】:我想在共享内存段中创建一个矩阵。在我的第二个程序中,我可以读取tailleX、tailleY,但我的矩阵的值只有“0”。... 查看详情

将 Boost 享元与共享内存一起使用

】将Boost享元与共享内存一起使用【英文标题】:UsingBoostflyweightwithsharedmemory【发布时间】:2013-06-2117:17:23【问题描述】:我想在共享内存中保留大量(经常重复的)字符串,因此我使用了Boost的享元和进程间basic_string功能。为了... 查看详情

共享内存 IPC(和其他 IPC)如何与多个 CPU 一起工作?

】共享内存IPC(和其他IPC)如何与多个CPU一起工作?【英文标题】:HowwouldsharedmemoryIPC(andotherIPC)workwithmultipleCPU?【发布时间】:2012-10-0418:37:59【问题描述】:我正在研究一种架构,其中2个CPU仅通过共享内存区域和一些GPIO/IRQ连接... 查看详情