2015-06-08 71 views
-1

golang如何共享或讀取其他進程共享內存? 我檢查了一些信息,但沒有找到相關信息。任何人都可以給我一個例子嗎?如何與Golang共享內存?

+0

也許您正在尋找內存映射文件? – alexn

回答

0

在走的世界裏,不要通過共享內存進行交流;通過通信共享內存。如果你真的想試試,你可以調用C API與CGO:

wrapper.c:

#include <stdlib.h> 
#include <string.h> 
#include <sys/shm.h> 
#include <sys/types.h> 

int my_shm_open(char* filename, int open_flag){ 
    int shm_id; 
    key_t key; 
    key = ftok(filename, 0x03); 
    if(key == -1){ 
     return -1; 
    } 
    if(open_flag) 
     shm_id = shmget(key, 4096, IPC_CREAT|IPC_EXCL|0600); 
    else 
     shm_id = shmget(key, 0, 0); 
    if(shm_id == -1){ 
     return -1; 
    } 
    return shm_id; 
} 

int my_shm_update(int shm_id, char* content){ 
    char* addr; 
    addr = (char*)shmat(shm_id, NULL, 0); 
    if(addr == (char*)-1){ 
     return -1; 
    } 
    if(strlen(content) > 4095) 
     return -1; 
    strcpy(addr, content); 
    shmdt(addr); 
    return 0; 
} 

int my_shm_close(int shm_id){ 
    shmctl(shm_id, IPC_RMID, NULL); 
    return 0; 
} 

char* my_shm_read(char* filename){ 
    int shm_id; 
    char* addr; 
    char* s; 
    shm_id = my_shm_open(filename, 0); 
    if(shm_id == -1) 
     return NULL; 
    addr = (char*)shmat(shm_id, NULL, 0); 
    if(addr == (char*)-1){ 
     return NULL; 
    } 
    s = (char*)malloc(strlen(addr) + 1); 
    strcpy(s, addr); 
    shmdt(addr); 
    return s; 
} 

reader.go

package main 

// #include <stdlib.h> 
// #include "wrapper.c" 
import "C" 
import "unsafe" 
import "fmt" 

func read(filename string) string { 
    f := C.CString(filename) 
    defer C.free(unsafe.Pointer(f)) 
    s := C.my_shm_read(f) 
    defer C.free(unsafe.Pointer(s)) 
    return C.GoString(s) 
} 

func main() { 
    fmt.Println(read("/tmp")) 
} 

writter。去:

package main 

// #include <stdlib.h> 
// #include "wrapper.c" 
import "C" 
import "unsafe" 

import (
    "log" 
    "time" 
) 

type errorString struct { 
    s string 
} 

func (e *errorString) Error() string { 
    return e.s 
} 

func open(file string) (int, error) { 
    f := C.CString(file) 
    defer C.free(unsafe.Pointer(f)) 
    r := int(C.my_shm_open(f, C.int(1))) 
    if r == -1 { 
     return 0, &errorString{"error"} 
    } 
    return r, nil 
} 

func update(shm_id int, content string) error { 
    c := C.CString(content) 
    defer C.free(unsafe.Pointer(c)) 
    r := int(C.my_shm_update(C.int(shm_id), c)) 
    if r == -1 { 
     return &errorString{"update error"} 
    } 
    return nil 
} 

func close(shm_id int) error { 
    C.my_shm_close(C.int(shm_id)) 
    return nil 
} 

func main() { 
    id, err := open("/tmp") 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer close(id) 
    err = update(id, "hello world") 
    if err != nil { 
     log.Fatal(err) 
    } 
    time.Sleep(1e9 * 100) 
} 

運行作者,然後由go run filename讀者。 該代碼是從here

-7

golang:它是一種編程語言,所以它不涉及操作系統級共享內存的事情。不是說golang不使用共享內存,但這不是它需要定義的。 Posix使用共享內存,可以使用syscall包,其中包含很多系統調用,只要引用c系統調用接口就行。