Linux下GO语言内存共享,CGO实现
来源:互联网 发布:折叠的北京 知乎 编辑:程序博客网 时间:2024/05/01 22:26
package ceimport ("errors""fmt""os""os/exec")/*#include <stdio.h>#include <sys/shm.h>#include <stdlib.h>#include <sys/ipc.h>#include <string.h>int Size;int Shm_id;key_t Key;char *Shm_add;int getMem(char *pathname,int size){ Key = ftok((char *)pathname,0x03); if(Key==-1) { return -1; } Shm_id=shmget(Key,size,IPC_CREAT|IPC_EXCL|0600); if (Shm_id==-1) { return -2; } Shm_add=shmat(Shm_id,0,0); if (Shm_add==(void *)-1) { return -3; } Size=size; return 0;}int close(){ int result; result=shmdt(Shm_add); if (result != 0) { return result; } result=shmctl(Shm_id, IPC_RMID, NULL); if (result != 0) { return result; } return 0;}int write(char *str){ int len;len=strlen(str);if (len >= Size){return 0;}strcpy((char *)Shm_add,(char *)str);return len;}char* read(){return (char *)Shm_add;}*/import "C"type Mem struct {Shm_id C.intsize int}func GetShareMem(path string, size int) (*Mem, error) {info, err := os.Lstat(path)if err != nil {return nil, err}if info.IsDir() {return nil, errors.New("Must Is File")}cstr := C.CString(path) num := C.getMem(cstr, C.int(size)) C.free(unsafe.Pointer(cstr))switch num {case 0:return &Mem{C.Shm_id, size}, nilcase -1:return nil, errors.New("Get Key error")case -2:return nil, errors.New("Get Shm_id error")case -3:C.close()return nil, errors.New("Map AddrSpace error")}C.close()return nil, errors.New("Unknow error")}func (self *Mem) Close() error {num := C.close() if num != 0 {cmd := exec.Command("ipcrm", "-m", fmt.Sprint(self.Shm_id))return cmd.Run()}return nil}func (self *Mem) Read() string {return C.GoString(C.read())}func (self *Mem) Write(body string) C.int { if len(body) > self.size { return C.int(0) } return C.write(C.CString(body))}
package mainimport ("flag""fmt")/*#include <stdio.h>#include <sys/shm.h>#include <sys/ipc.h>char* GetMem(int Shm_id){ char *Shm_add; Shm_add=shmat(Shm_id,0,0); if (Shm_add==(void *)-1) { return (char *)-1; } return (char *)Shm_add;}int close(char *Shm_add){int result;result=shmdt(Shm_add); if (result != 0) { return result; }}*/import "C"type ShareMem struct {Addr *C.char}func main() {i := flag.Int("m", 0, "-m=12345")flag.Parse()x := GetShareMem(*i)if x == nil {fmt.Println("open error")}defer x.Close()fmt.Println(x.Read())}func GetShareMem(shm_id int) *ShareMem {m,err := C.GetMem(C.int(shm_id))if err != nil {return nil}return &ShareMem{m}}func (self *ShareMem) Close() {C.close(self.Addr)}func (self *ShareMem) Read() string {return C.GoString(self.Addr)}
package mainimport ( "fmt" "ce")func main() {m, err := ce.GetShareMem("/tmp/.tmpfile", 1024)if err != nil {fmt.Println(err)}defer m.Close()m.Write("fyxichen")fmt.Println(m.Read())}
1 0
- Linux下GO语言内存共享,CGO实现
- Go语言linux下构造tcp数据包(不使用net包和Cgo)
- go语言cgo -- C与Go互调
- C语言?Go语言?还是CGO语言!
- Go语言 使用CGo进行优化
- go语言的cgo简单教程
- go语言的cgo简单教程
- go cgo
- go--cgo
- linux下共享内存的实现
- golang go语言与C语言互调,通过cgo
- linux下C语言编程4-使用共享内存实现进程间通信
- linux下C语言编程4-使用共享内存实现进程间通信2
- Go语言使用CGO获取Windows的CPU使用率
- linux下共享内存
- linux下内存共享
- linux下C语言编程7-信号量与共享内存
- GO语言linux下环境变量
- H5技术实现教程:多屏CSS动画精进技巧
- <Python for Kids>读书笔记
- 转载Eclipse卡顿优化
- WordPress -NewsPlus主题-博客新闻杂志门户,完美中/英文主题
- 使用imageloader加载图片及缩放策略
- Linux下GO语言内存共享,CGO实现
- Codeforces Round #334 (Div. 2)B. More Cowbell(二分+贪心)
- linker command failed with exit code 1 (use -v to see invocation)总结
- c#将json转换为dynamic对象
- mysql5.6.17 zip安装、卸载及root密码修改
- 实战解析Android架构设计原则
- 不用栈,来实现二叉树的非递归中序遍历
- 【Solutions系列】雪灾交通应急处理模板
- PowerDesigner(一)-PowerDesigner概述