关于Go语言共享内存操作的小实例

前端之家收集整理的这篇文章主要介绍了关于Go语言共享内存操作的小实例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
<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上提问别人回答的,还是不是太懂,先留着!

猜你在找的Go相关文章