分享
go调用c代码示例
shawn chen · · 5225 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
代码功能:
调用posix的共享内存接口,写入和读取共享内存数据;
代码:
package main
/*
#cgo LDFLAGS: -lrt
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
*/
import "C"
import "unsafe"
import "fmt"
import "os"
func main() {
name := C.CString("testshm")
defer C.free(unsafe.Pointer(name))
fd, err := C.shm_open(name, C.int(C.O_RDWR|C.O_CREAT), 0)
if err != nil {
fmt.Println(err.Error())
}
fmt.Printf("fd:%d", int(fd))
ret, err := C.ftruncate(fd, 1024*1024)
if err != nil || ret != 0 {
fmt.Println("truncate failed.")
os.Exit(1)
}
strTest := `hello, test write to shared memory`
content := C.CString(strTest)
res, err := C.write(fd, unsafe.Pointer(content), C.size_t(len(strTest)))
if err != nil || res == -1 {
fmt.Println("write to shared memory failed.")
os.Exit(1)
}
C.lseek(fd, 0, C.SEEK_SET)
//pRead := make([]byte, 100)
pRead := C.malloc(100)
defer C.free(pRead)
bytesRead, err := C.read(fd, unsafe.Pointer(pRead), 100)
if err != nil {
fmt.Println(err.Error())
os.Exit(1)
}
fmt.Printf("bytes read :%d, str are:%s", bytesRead, string(C.GoBytes(pRead, 100)))
C.getchar()
C.shm_unlink(name)
}
3. 注意引入的头文件注释行与golang的import代码行直接必须无空行;
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信5225 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
代码功能:
调用posix的共享内存接口,写入和读取共享内存数据;
代码:
package main
/*
#cgo LDFLAGS: -lrt
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
*/
import "C"
import "unsafe"
import "fmt"
import "os"
func main() {
name := C.CString("testshm")
defer C.free(unsafe.Pointer(name))
fd, err := C.shm_open(name, C.int(C.O_RDWR|C.O_CREAT), 0)
if err != nil {
fmt.Println(err.Error())
}
fmt.Printf("fd:%d", int(fd))
ret, err := C.ftruncate(fd, 1024*1024)
if err != nil || ret != 0 {
fmt.Println("truncate failed.")
os.Exit(1)
}
strTest := `hello, test write to shared memory`
content := C.CString(strTest)
res, err := C.write(fd, unsafe.Pointer(content), C.size_t(len(strTest)))
if err != nil || res == -1 {
fmt.Println("write to shared memory failed.")
os.Exit(1)
}
C.lseek(fd, 0, C.SEEK_SET)
//pRead := make([]byte, 100)
pRead := C.malloc(100)
defer C.free(pRead)
bytesRead, err := C.read(fd, unsafe.Pointer(pRead), 100)
if err != nil {
fmt.Println(err.Error())
os.Exit(1)
}
fmt.Printf("bytes read :%d, str are:%s", bytesRead, string(C.GoBytes(pRead, 100)))
C.getchar()
C.shm_unlink(name)
}
3. 注意引入的头文件注释行与golang的import代码行直接必须无空行;