gpt4 book ai didi

c - golang 对共享内存的支持

转载 作者:IT王子 更新时间:2023-10-29 02:24:02 26 4
gpt4 key购买 nike

在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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com