<strong style="margin: 0px; padding: 0px; border: 0px; font-size: 15px; font-weight: bold; color: rgb(34,34,34); font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 19px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255,255,255);">wrapper.c</strong> #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); 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,0); if(addr == (char*)-1){ return NULL; } s = (char*)malloc(strlen(addr) + 1); strcpy(s,addr); shmdt(addr); return s; }
<strong style="margin: 0px; padding: 0px; border: 0px; font-size: 15px; font-weight: bold; color: rgb(34,255);">reader.go</strong> 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")) }
<strong style="margin: 0px; padding: 0px; border: 0px; font-size: 15px; font-weight: bold; color: rgb(34,255);">writter.go</strong> 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) }这个是我在stackoverflower上提问别人回答的,还是不是太懂,先留着! 原文链接:https://www.f2er.com/go/190370.html