为了账号安全,请及时绑定邮箱和手机立即绑定

意外类型:......在 Go 中使用 cgo

意外类型:......在 Go 中使用 cgo

Go
肥皂起泡泡 2021-08-30 14:38:26
我是 Go 的新手,正在尝试学习如何从 Go 调用 C。我编写了这个程序来打开一个命名的信号量,获取值并将其打印到屏幕上。当我运行它时,go build semvalue.go我收到错误: ./semvalue.go:16:14: unexpected type: ...这是什么意思?我究竟做错了什么?package mainimport "fmt"// #cgo LDFLAGS: -pthread// #include <stdlib.h>// #include <fcntl.h>// #include <sys/stat.h>// #include <semaphore.h>import "C"func main() {    name := C.CString("/fram")    defer C.free(name)    fram_sem := C.sem_open(name, C.O_CREAT, C.mode_t(0644), C.uint(1))    var val int    ret := C.sem_getvalue(fram_sem, val)    fmt.Println(val)    C.sem_close(fram_sem)}谢谢你。
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

该消息令人困惑,直到您意识到...是 C 函数的可变参数部分。您不能直接从 Go 中使用 C 可变参数函数,因此您必须在 C 中编写一个小包装器来调用sem_open.

还有一些注意事项:

  • C.free 应该用 C.free(unsafe.Pointer(name))

  • val 需要是一个 *C.int

  • sem_getvalue使用errno,所以你应该用ret, err := C.sem_getvalue...


查看完整回答
反对 回复 2021-08-30
  • 1 回答
  • 0 关注
  • 325 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信