Skip to content

Instantly share code, notes, and snippets.

@artyom
Created November 1, 2013 12:21
Show Gist options
  • Save artyom/7264639 to your computer and use it in GitHub Desktop.
Save artyom/7264639 to your computer and use it in GitHub Desktop.
Using epoll from Go.
package main
import (
"log"
"os"
"syscall"
)
func main() {
f, err := os.Open("/tmp/pipe")
if err != nil {
log.Fatal("file open error ", err)
}
defer f.Close()
fd := int(f.Fd())
if err := syscall.SetNonblock(fd, true); err != nil {
log.Fatal("failed to switch fd to non-blocking mode ", err)
}
epollFd, err := syscall.EpollCreate1(0)
if err != nil {
log.Fatal("epoll create error ", err)
}
defer syscall.Close(epollFd)
if err := syscall.EpollCtl(epollFd, syscall.EPOLL_CTL_ADD, fd,
&syscall.EpollEvent{Events: syscall.EPOLLIN, Fd: int32(fd)}); err != nil {
log.Fatal("error registering event ", err)
}
events := make([]syscall.EpollEvent, 32)
n, err := syscall.EpollWait(epollFd, events, -1)
if err != nil {
log.Fatal("error receiving events from epoll ", err)
}
for _, ev := range events[:n] {
log.Printf("read event on fd #%d", ev.Fd)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment