2017-10-08 147 views
1

我正在玩golang的syscall庫中的inotify功能。我可以使用InotifyInit設置inotify功能,添加一個文件以便與InotifyAddWatch一起觀看,並使用Read函數檢測文件更改。我遇到的問題是Read函數只讀入包含inotify事件信息的字節數組。我想轉換/施放該字節數組到InotifyEvent結構,使我可以訪問有關inotify事件信息正確將字節數組轉換爲Golang中的syscall.InotifyEvent結構

下面是我到目前爲止有:

package main 

import (
    "fmt" 
    "syscall" 
) 

func main() { 
    buff := make([]byte, 64) 
    inotefd, err := syscall.InotifyInit() 
    if err != nil { 
     fmt.Println(err) 
    } 
    _, err = syscall.InotifyAddWatch(inotefd, "/home/me/foo", syscall.IN_MODIFY) 
    if err != nil { 
     fmt.Println(err) 
    } 

    for { 
     n, err := syscall.Read(inotefd, buff) 
     if err != nil { 
      fmt.Println(err) 
      return 
     } 

     if n < 0 { 
      fmt.Println("Read Error") 
      return 
     } 

     fmt.Printf("Buffer: %v\n", buff) 
     //can't cast []buff into InotifyEvent struct 
     fmt.Printf("Cookie: %v\n", buff[0:4]) 
     fmt.Printf("Len: %v\n", buff[4:8]) 
     fmt.Printf("Mask: %v\n", buff[8:12]) 
     fmt.Printf("Name: %v\n", buff[12:13]) 
     fmt.Printf("Wd: %v\n", buff[13:17]) 
    } 
} 

感謝您的幫助!

回答

1

可以使用unsafe包爲:

info := *((*syscall.InotifyEvent)(unsafe.Pointer(&buff[0])))