2015-02-28 3 views
1

Я слышал лозунг в 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.

+1

Какая платформа? Unix, Windows или оба? –

+0

Я думаю, что прохождение пропущенных указателей - это более простая передача управляемой памяти на C. Если вы в основном выполняете функции shm * (на linux), GC Go не будет перемещать этот материал, так как он не управляется run runtime –

+0

@DavidBudworth, если Я вызываю C-процедуру в golang, чтобы получить указатель на область разделяемой памяти, могу ли я использовать код golang для обработки данных, на которые указывает? но в этом есть голанг, но я очень рад отличным функциям, которые могут предложить. – packetie

ответ

0

Я полагаю, что вы имеете в виду разделяемую память System V IPC. В golang-nuts есть хорошая статья о том, как идти о внедрении семафоров System V IPC, и многое из этого также применимо к системным вызовам shm.

Вы можете использовать CGO, но, как правило, лучше писать чистые функции Go, которые непосредственно вызовут системные вызовы UNIX. Пакет на golang.org/x/sys/unix содержит много хороших примеров того, как вызывать системные вызовы от Go без привлечения CGO. (Если вы пойдет по этому пути, было бы неплохо создать CL для обновления этого пакета).

Смежные вопросы