關於Go語言共用記憶體操作的小執行個體

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
<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, 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上提問別人回答的,還是不是太懂,先留著。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.