Skip to content

Instantly share code, notes, and snippets.

@smallnest
Forked from artyom/epoll.go
Created August 9, 2018 10:47
Show Gist options
  • Save smallnest/938c5215460de0d6016fcc84a73c0739 to your computer and use it in GitHub Desktop.
Save smallnest/938c5215460de0d6016fcc84a73c0739 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