zoukankan      html  css  js  c++  java
  • 关于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- 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- 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- 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上提问别人回答的,还是不是太懂,先留着。

  • 相关阅读:
    Springboot中mybatis控制台打印sql语句
    CTF资源
    Python渗透测试工具合集
    哪些方法可以绕过PowerShell Execution Policy?
    路由器漏洞挖掘使用的脚本
    路由器漏洞挖掘(栈,危险函数,方法)
    路由器漏洞挖掘环境搭建
    MIPS 汇编指令学习
    Linux下安装Sublime Text 3 及使用快捷方式
    Ubuntu 16.04 安装Python 3.6
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5232186.html
Copyright © 2011-2022 走看看