2017-07-26 53 views
0
package main 

/* 
#define _GNU_SOURCE 1 
#include <stdio.h> 
#include <stdlib.h> 
#include <utmpx.h> 
#include <fcntl.h> 
#include <unistd.h> 

char *path_utmpx = _PATH_UTMPX; 

typedef struct utmpx utmpx; 
*/ 
import "C" 
import (
    "fmt" 
    "io/ioutil" 
) 

type Record C.utmpx 

func main() { 

    path := C.GoString(C.path_utmpx) 

    content, err := ioutil.ReadFile(path) 
    handleError(err) 

    var records []Record 

    // now we have the bytes(content), the struct(Record/C.utmpx) 
    // how can I cast bytes to struct ? 
} 

func handleError(err error) { 
    if err != nil { 
    panic("bad") 
    } 
} 

我正在嘗試將content轉換爲Record 我已經提出了一些相關問題。如何投入字節結構(C結構)在去?

Cannot access c variables in cgo

Can not read utmpx file in go

我看過一些文章和帖子,但仍然無法想出一個辦法做到這一點。

回答

2

我想你會錯誤地回答這個問題。如果你想使用C庫,你可以使用C庫來讀取文件。

不要單純使用cgo來定義結構,你應該在Go中創建它們。然後,您可以編寫適當的編組/解組碼來從原始字節讀取。

快速Google顯示有人已經完成了將相關C庫的外觀轉換爲Go所需的工作。請參閱utmp repository

這如何可以使用的簡單的例子是:

package main 

import (
    "bytes" 
    "fmt" 
    "log" 

    "github.com/ericlagergren/go-gnulib/utmp" 
) 

func handleError(err error) { 
    if err != nil { 
     log.Fatal(err) 
    } 
} 

func byteToStr(b []byte) string { 
    i := bytes.IndexByte(b, 0) 
    if i == -1 { 
     i = len(b) 
    } 
    return string(b[:i]) 
} 

func main() { 
    list, err := utmp.ReadUtmp(utmp.UtmpxFile, 0) 
    handleError(err) 
    for _, u := range list { 
     fmt.Println(byteToStr(u.User[:])) 
    } 
} 

您可以查看GoDocutmp包以獲取更多信息。

+0

我知道這個回購,我已經讀過它。我只想嘗試一下。感謝您的回答。我得到了'undefined:utmp.ReadUtmp','undefined:utmp.UtmpxFile'。 –

+0

我想等着看有沒有其他答案。 –

+1

GZ薛,你運行了'go get github.com/ericlagergren/go-gnulib/utmp'來安裝utmp庫嗎? – Mark