Go 使用epoll监视inotify事件

Go 使用epoll监视inotify事件,go,epoll,inotify,Go,Epoll,Inotify,我想使用inotify监视一些文件更改,并使用epoll监视是否发生inotify事件。但是,我在接收inotify事件时遇到了一些问题。喂,我怎么知道我是否知道发生的每一件事 如果inotify fd设置为非块模式,则在read()时返回EAGAIN,这表示没有其他内容可读取,这很好。但如果inotiffd设置为阻塞模式,read()将无限阻塞 例如,如果你 通过请求读取一定数量的数据并调用read(2) read(2)返回较低的字节数,您可以确定 已耗尽文件描述符的读取I/O空间 参考: 根

我想使用inotify监视一些文件更改,并使用epoll监视是否发生inotify事件。但是,我在接收inotify事件时遇到了一些问题。喂,我怎么知道我是否知道发生的每一件事

如果inotify fd设置为非块模式,则在
read()
时返回EAGAIN,这表示没有其他内容可读取,这很好。但如果inotiffd设置为阻塞模式,
read()
将无限阻塞

例如,如果你 通过请求读取一定数量的数据并调用read(2) read(2)返回较低的字节数,您可以确定 已耗尽文件描述符的读取I/O空间

参考:

根据,如果
read()
返回的字节数较低,我可以确保彻底读取。但是如何处理返回相同字节数的
read()

这是我试过的代码

func main(){
fd,:=unix.InotifyInit()
epollfd,u1;:=unix.EpollCreate(1)
unix.EpollCtl(epollfd、unix.EPOLL\u CTL\u ADD、fd和unix.EpollEvent{
Fd:int32(Fd),
事件:unix.EPOLLIN,
})
unix.InotifyAddWatch(fd,os.Args[1],unix.IN_ALL_事件)
EpollEvent:=make([]unix.EpollEvent,8)
为了{
//埃波尔等待
内波尔内特酒店
如果nepoll,err=unix.EpollWait(epollfd,epollevents,-1);err==nil{
//什么也没发生
}else if errors.Is(err,unix.EINTR){
继续//忽略中断
}否则{
log.Fatal(err.Error())
}
//处理inotify事件
对于i:=0;i=unix.PathMax+unix.SizeofInotifyEvent){
事件:=(*unix.InotifyEvent)(不安全的.Pointer(&eventBuff[offset]))
切换事件掩码{
案例unix.IN_访问:
// ...
案例unix.IN_打开:
// ...
案例unix.IN_关闭_写入:
// ...
案例unix.IN\u CLOSE\u NOWRITE:
// ...
}
偏移量+=unix.sizeofinitifyevent+int(event.Len)
}
复制(eventBuff[偏移量:lastUnread],eventBuff[:lastUnread偏移量])
lastUnread-=偏移量
偏移量=0
}
}
fmt.Println(“结束”)//在阻塞模式下从未得到打印输出
}
}