2014-11-10 7 views
5

Ich bin neu in Go und versuche zu lernen, wie man C von Go anruft. Ich schrieb dieses Programm, um einen benannten Semaphor zu öffnen, den Wert zu erhalten und es auf den Bildschirm zu drucken. Wenn ich es go build semvalue.go laufen bekomme ich den Fehler: ./semvalue.go:16:14: unexpected type: ...unerwarteter Typ: ... mit cgo in Go

Was bedeutet das? Was mache ich falsch?

package main 

import "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) 
} 

Vielen Dank.

Antwort

8

Die Nachricht ist verwirrend, bis Sie feststellen, dass der ... der variable Teil einer C-Funktion ist. Sie können C variadic-Funktionen nicht direkt von Go aus verwenden, Sie müssen also einen kleinen Wrapper in C schreiben, um sem_open aufzurufen.

Noch ein paar Anmerkungen:

  • C.free sollte mit C.free(unsafe.Pointer(name))
  • val Bedürfnisse sein, ein *C.int
  • sem_getvalue verwendet errno genannt werden, so dass Sie es mit ret, err := C.sem_getvalue...
nennen sollte