-
-
Save smallnest/938c5215460de0d6016fcc84a73c0739 to your computer and use it in GitHub Desktop.
Using epoll from Go.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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