Skip to content

Instantly share code, notes, and snippets.

@purpleidea
Forked from ast/main.go
Created May 7, 2018 15:04
Show Gist options
  • Save purpleidea/2d981d6e8d68bfdb68f809302770f4a3 to your computer and use it in GitHub Desktop.
Save purpleidea/2d981d6e8d68bfdb68f809302770f4a3 to your computer and use it in GitHub Desktop.
Using epoll with go. Packages like fsnotify does not work with sysfs. Then you need epoll, poll or select.
package main
import (
"golang.org/x/sys/unix"
"log"
"os"
)
func main() {
file, err := os.Open("/sys/class/somefile")
if err != nil {
log.Fatal(err)
}
epfd, err := unix.EpollCreate(5) // 5 is just an example, see man page.
if err != nil {
log.Fatal(err)
}
events := make([]unix.EpollEvent, 1, 5)
events[0] = unix.EpollEvent{
Events: unix.EPOLLPRI | unix.EPOLLHUP | unix.EPOLLERR,
Fd: int32(file.Fd()),
}
err = unix.EpollCtl(epfd, unix.EPOLL_CTL_ADD, int(file.Fd()), &events[0])
if err != nil {
log.Fatal(err)
}
bs := make([]byte, 100, 100)
for {
n, err := unix.EpollWait(epfd, events, -1)
if err != nil {
log.Fatal(err)
}
r, err := file.Read(bs)
if err != nil {
log.Fatal(err)
}
// seek to beginning to relatch event
file.Seek(0, 0)
log.Printf("%v %v %v", n, r, string(bs[0:r]))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment