分享
  1. 首页
  2. 文章

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

fyxichen · · 3704 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

<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上提问别人回答的,还是不是太懂,先留着!


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:fyxichen

查看原文:关于Go语言共享内存操作的小实例

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
3704 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏