c - golang 对共享内存的支持

标签 c go

在golang中听说过共享内存通过通信的口号,但是这里我有一个需求,就是要写一个应用程序来和一个已经存在的使用共享内存的应用程序A进行交互。基本上 A 在内存中写入一大块数据(大到其他 IPC 方式效率低下),然后等待程序 B 处理它并将结果报告给 A。

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

有什么想法吗?谢谢!

更新 1: 忘了说这是在 Ubuntu 12.04 上。感谢您的询问。

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

名为“reader.go”的 golang 代码

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

名为 wrapper.c 的 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:

找到导致 go 崩溃的行:defer C.free(unsafe.Pointer(s)) 没有它,一切正常。

来源:代码片段改编自 https://gist.github.com/jedy/3282764 .

最佳答案

我认为您指的是 System V IPC 共享内存。 golang-nuts有好帖子关于如何着手实现 System V IPC 信号量的信息,其中大部分内容也适用于 shm 系统调用。

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

关于c - golang 对共享内存的支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28778521/

相关文章:

全局变量的类型 C 冲突

c - 来自 dlsym 的通用函数,带有取消引用的 float

go - Go 中的资源文件

google-app-engine - 使用部分字符串作为过滤器在 Go GAE 数据存储中搜索条目

go - 在多个线程中运行一个函数

c - 为什么C在调用汇编函数时不将指针压入堆栈?

c++ - 编译 OpenCV 项目时如何禁用 TBB

c - 返回 C 中带有 const 数组的结构体

go - 如何在 Golang 应用程序中正确使用 UUID4?

go - 如何在 cgo 中正确使用 64 位 TDM-GCC?