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

最新文章

  1. webgl动画小测试
  2. (转载)开始iOS 7中自动布局教程(一)
  3. 4. 什么是AJAX
  4. Time crumbles things; everything grows old under the power of Time and is forgotten through the lapse of Time
  5. objdump 分析
  6. iOS GCD, 同步,异步,串行队列,并行队列,dispatch_group
  7. IOS - Foundation和Core Foundation掺杂使用桥接
  8. java中PriorityQueue优先级队列使用方法
  9. VirtualBox网络配置
  10. OpenStack 多台计算节点时的问题
  11. foxmail收发gmail彻底失败
  12. Eclipse搭建struts2环境
  13. 关于struts2的checkboxlist、select等标签发生could not be resolved as a collection/array/map/enumeration/iterator type异常的记录
  14. maven引用net.sf.json-lib
  15. 201521123050 《Java程序设计》第13周学习总结
  16. IdentityModel 中文文档(v1.0.0) 目录
  17. 使用jQuery+huandlebars遍历中if判断
  18. Ubuntu16.04搭建QingdaoU(docker一键式部署)
  19. Zabbix 添加主机
  20. ArcGIS放射状流向地图

热门文章

  1. [iOS]使用symbolicatecrash分析crash文件
  2. Java为什么使用连接池
  3. Asp.net +Jquery-uploadify多文件上传
  4. rhel Linux 网络配置
  5. NumberBox( 数值输入框) 组件
  6. 《第一行代码》学习笔记34-服务Service(1)
  7. java.lang.NoSuchMethodError: com.google.common.collect.Maps.newConcurrentMap()Ljava/util/concurrent/Concurren‌​tMap;
  8. Access中的SELECT @@IDENTITY
  9. html的form元素
  10. POJ3104 Drying(二分查找)