golang支持共享内存

时间:2015-02-28 05:37:37

标签: c go

我通过通信听到golang关于共享内存的口号,但在这里我需要编写一个应用程序来使用共享内存与现有应用程序A进行交互。基本上A在内存中写入大量数据(如此之大以至于其他其他IPC方式效率低下),并等待程序B处理它并将结果报告给A.

由于其可编程性和速度,想使用golang编写程序B,但是没有看到对共享内存的直接支持。想在golang中使用C接口但是在两种语言之间传递指针存在问题。

有什么想法吗?谢谢!

UPDATE1 :    忘了提到这是在Ubuntu 12.04上。谢谢你的询问。

UPDATE2 :    创建了一个简单的程序来测试C指针指向的数据的读取。

golang代码叫做“reader.go”

import "C"
import "unsafe"
import "fmt"

func read(filename string) string {
    f := C.CString(filename)
    defer C.free(unsafe.Pointer(f))
    s := C.testc(f)
    defer C.free(unsafe.Pointer(s))
    return C.GoString(s)
}

func main() {
    fmt.Println(read("tmp"))
}

C代码名为wrapper.c

#include <sys/types.h>
#include <stdio.h>
#include <errno.h>

char buf[0x10000];

char* testc(char* filename){
    printf("reading file %s\n", filename);
    FILE *fp = fopen(filename, "r");
    fread(buf, 1, 100, fp);
    fclose(fp);
    return buf;
}

运行go run reader.go时,得到一个堆栈转储(这里包含的时间太长)。

更新3

查找导致崩溃的行:defer C.free(unsafe.Pointer(s)) 没有它,事情就可以了。

信用:代码段改编自https://gist.github.com/jedy/3282764

1 个答案:

答案 0 :(得分:0)

我认为你指的是System V IPC共享内存。 golang-nuts中有一篇关于如何实现System V IPC信号量的好文章,其中大部分内容也适用于shm系统调用。

您可以使用CGO,但通常最好编写直接调用UNIX系统调用的纯Go函数。 golang.org/x/sys/unix处的包中包含许多很好的示例,说明如何从Go调用系统调用而不必涉及CGO。 (如果您沿着这条路走下去,那么创建一个CL来更新该软件包将是一个好主意。)