我通过通信听到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。
答案 0 :(得分:0)
我认为你指的是System V IPC共享内存。 golang-nuts中有一篇关于如何实现System V IPC信号量的好文章,其中大部分内容也适用于shm系统调用。
您可以使用CGO,但通常最好编写直接调用UNIX系统调用的纯Go函数。 golang.org/x/sys/unix处的包中包含许多很好的示例,说明如何从Go调用系统调用而不必涉及CGO。 (如果您沿着这条路走下去,那么创建一个CL来更新该软件包将是一个好主意。)