<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);elseshm_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;}
<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);">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, 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);">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上提问别人回答的,还是不是太懂,先留着!
,你在会议中吵架时,尼泊尔的背包客一起端起酒杯坐在火堆旁。