2015-05-27 7 views
6

ile ilgili birlikte çalışabilirlik sorunu lib_proc.h'dan proc_name(pid,...) işlevini saran bir Go işlevi kullanıyorum.C ve Gofree()

Bu tam C prototip geçerli:

(en azından benim sistemde) /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/libproc.h burada bulabilirsiniz

int proc_name(int pid, void * buffer, uint32_t buffersize) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); 

. Bu kod kaldırılır C.free(unsafe.Pointer(...)) ve import "unsafe" maddesi çağrısına sürece derlemek olmaz


package goproc 

    /* 
    #include "libproc.h" 

    int call_proc_name(int pid, char *name, int name_size) { 
     return proc_name(pid, name, name_size); 
    } 
    */ 
    import "C" 
    import "unsafe" 
    import "strings" 

    type DarwinProcess struct { 
     Process 
    } 

    func (DarwinProcess) NameOf(pid int) string { 
     name := C.CString(strings.Repeat("\x00", 1024)) 
     defer C.free(unsafe.Pointer(name)) 
     nameLen := C.call_proc_name(C.int(pid), name, C.int(1024)) 
     var result string 

     if (nameLen > 0) { 
      result = C.GoString(name); 
     } else { 
      result = "" 
     } 

     return result; 
    } 

:

It

Git kodunu izler. DarwinProcess::NameOf(pid) yönteminin yalnızca Mac OS X ve üzerinde çalışması amaçlanmıştır, bu kod C.free(...) koddan kaldırılırsa çalışır.

Gerçek formda go build sonra aşağıdaki hata iletisini alıyorum: could not determine kind of name for C.free (ve daha fazlası, bu, tüm derleyici çıktısıdır).

C.free(...) kaldırılması benim için kabul edilemez, C.CString() ile ayrılan belleği düzgün bir şekilde nasıl boşaltacağımı bulmalıyım.

documentation'a göre şaşkın durumdayım, her şey doğru şekilde yapıldı. Bir çözüm bulamadık ne de web'de arama yapamıyorum.

+0

cgo yorumunuza #include 'eklemeyi denediniz mi? –

cevap

5

libproc.h, free()'un bildirildiği stdlib.h'u içermez. Bu nedenle, derleyici adı çözemez. C0 yorum bloğu başında #include <stdlib.h> ekledikten sonra kodunuz sistemimde başarıyla oluşturuldu.

+0

+1 Bu mükemmel bir şekilde çalıştı ve sorumu yanıtladı. Dürüst olmak gerekirse, 'C.free()' nin özel "C" paketinin bir parçası olduğunu öne süren belgelerle yanıltılmıştım. Ama aslında standart stdlib :: free() 'den bahsediyoruz. – gsscoder

+0

Diğer çalışma zamanlarında olduğu gibi, Go lib'leri zaten çalışan işletim sistemlerini yönetmek için bir API'den yoksundur, bu yüzden bir tane yazmaya çalışıyorum. Şimdilik sadece bir saplama (https://github.com/gsscoder/goproc). – gsscoder