Я слышал лозунг в golang об общей памяти через связь, но здесь мне нужно написать приложение для взаимодействия с существующим приложением A, использующим общую память. В основном A пишет большой кусок данных в памяти (настолько большой, что он неэффективен для других других средств IPC), и дождитесь, пока программа B обработает его и сообщит результат A.поддержка golang для общей памяти
Хотелось бы написать программу B с использованием golang из-за его возможности сценариев и скорости, но не видят прямой поддержки для общей памяти. Мысль об использовании интерфейса C в golang, но есть проблема с прохождением указателей между двумя языками.
Любые идеи? Благодаря!
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
, получил stackdump на ходу (слишком долго, чтобы включить здесь).
UPDATE 3:
Найдите строку, вызвавшую перейти к аварии: defer C.free(unsafe.Pointer(s))
Без него, все работает отлично.
Кредит: код фрагмента адаптирован от https://gist.github.com/jedy/3282764.
Какая платформа? Unix, Windows или оба? –
Я думаю, что прохождение пропущенных указателей - это более простая передача управляемой памяти на C. Если вы в основном выполняете функции shm * (на linux), GC Go не будет перемещать этот материал, так как он не управляется run runtime –
@DavidBudworth, если Я вызываю C-процедуру в golang, чтобы получить указатель на область разделяемой памяти, могу ли я использовать код golang для обработки данных, на которые указывает? но в этом есть голанг, но я очень рад отличным функциям, которые могут предложить. – packetie