2015-05-27 13 views
6

Tôi có chức năng Go kết thúc tốt chức năng proc_name(pid,...) từ lib_proc.h.Sự cố tương tác với C và Go liên quan đến C.free()

Đây là hoàn C nguyên mẫu:


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

có thể được tìm thấy ở đây /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/libproc.h (ít nhất là trên hệ thống của tôi).

Nó sau đang Go:


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; 
    } 

Mã này sẽ không biên dịch trừ khi cuộc gọi đến C.free(unsafe.Pointer(...))import "unsafe" khoản sẽ bị xóa. Phương pháp DarwinProcess::NameOf(pid) chỉ hoạt động trên Mac OS Xnó thực sự hoạt động nếu C.free(...) bị xóa khỏi mã.

Ở dạng thực tế của nó sau khi go build tôi nhận được thông báo lỗi sau: could not determine kind of name for C.free (và không có gì hơn, đây là toàn bộ sản lượng biên dịch).

Không thể chấp nhận việc xóa C.free(...) đối với tôi, tôi phải tìm cách giải phóng bộ nhớ được cấp phát một cách phù hợp với C.CString().

Tôi đang bối rối vì, theo số documentation, mọi thứ đều được thực hiện đúng cách. Tôi đã không thể tìm thấy một giải pháp hay tìm kiếm ở đây cũng như trên web.

+0

Bạn đã thử thêm '#include ' vào nhận xét cgo của mình chưa? –

Trả lời

5

libproc.h không bao gồm stdlib.h, trong đó free() được khai báo. Như vậy, trình biên dịch không thể giải quyết tên. Sau khi tôi thêm #include <stdlib.h> vào đầu chú thích cgo, mã của bạn được tạo thành công trên hệ thống của tôi.

+0

+1 Điều này làm việc hoàn hảo và trả lời câu hỏi của tôi. Thành thật mà nói tôi đã bị lừa bởi tài liệu có vẻ gợi ý rằng 'C.free()' là một phần của gói 'C' đặc biệt. Nhưng trong thực tế chúng ta đang nói về tiêu chuẩn 'stdlib :: free()'. – gsscoder

+0

Giống như các runtimes khác, Go libs thiếu một API để quản lý các tiến trình OS đang chạy, vì vậy tôi đang cố gắng viết một. Bây giờ chỉ là một bài sơ khai (https://github.com/gsscoder/goproc). – gsscoder

Các vấn đề liên quan