我希望在修改给定目录下(直接或间接)任何文件时通知我的代码.通过"修改",我的意思是我希望每当文件的内容被更改,重命名或删除时都会通知我的代码; 或者是否添加了新文件.对于我的应用程序,可能有数千个文件.
我看起来像FSEvents,但其技术概述部分地说:
需要注意的重点是通知的粒度在目录级别.它只告诉您目录中的某些内容已更改,但不会告诉您更改的内容.
它还说:
文件系统事件API也不是为了查找特定文件何时更改而设计的.出于这种目的,kqueues机制更合适.
但是,为了在给定文件上使用kqueue,必须打开文件以获取文件描述符.管理数千个文件描述符是不切实际的(并且可能会超过最大允许的打开文件描述符数).
奇怪的是,在Windows下,我可以使用该ReadDirectoryChangesW()功能,它正是我想要的.
那么如何在Mac OS X下做我想做的事情呢?或者,问另一种方式:如何ReadDirectoryChangesW()在用户空间中编写等效的Mac OS X(并且非常有效地执行此操作)?
在如何在单个事件循环中一起使用AIO和epoll的讨论之后?.
实际上Linux中有2个"aio"API.有一个POSIX aio(aio_*系列函数),包含在glibc和libaio开发中我相信RedHat(?),io_*系列.
第一个允许通过aio_sigevent aiocb成员注册通知请求.这可以很容易地与ppoll()/ pselect()事件循环集成.如果你想将POSIX aio与epoll()集成,那么你需要将信号转换为虚拟fd(管道可能)上的事件并用epoll监听它,同时以经典方式或使用ppoll /捕获信号选择.第一选择(正常的sighandlers)的安全性取决于应用.也许在epoll上,但我并不完全了解它的内部结构.我可以安全地假设,如果我有一个基于epoll的应用程序,并且我想添加POSIX aio支持,那么我搞砸了?这是我的问题.
第二个AIO实现libaio - 可以与eventfd()一起使用(struct iocb具有aio_resfd成员,该成员预期为零或者eventfd用于提供AIO结果).但这不是书.指定POSIX,即.
我梦想自己是一个*BSD用户,一切都很清楚.您对AIO事件有POSIX AIO和kqueue()支持.晶莹剔透.像许多其他的东西.
我正在使用监视程序监视OS X上的.less文件更改事件.如果我使用TextMate或Sublime Text更改.less文件的内容,则会捕获修改事件.但是,如果我使用vim编辑内容,则不会触发文件修改事件(但会捕获使用vim创建的文件的文件创建事件).我已经看到了与FSEvents和kqueue相同的行为(两者我几乎都不知道).
我想知道有人可以解释这种行为吗?
我希望监视一个目录(数千个文件,大约有5个子目录级别),以便更改文件.我知道我可以使用FSEvents API监视目录,以便在该目录中更改文件,但我似乎无法弄清楚如何确定哪些文件发生了变化.这个引用建议我在每次触发事件时构建一个二叉树并遍历树,这是确定哪些文件被更改的最佳方法吗?如果没有,有什么更好的选择?
是否更好地递归扫描目录并将kqueue附加到每个文件?我不确定这对成千上万的文件有多好?
我正在学习使用epoll功能.但我的OS X,Mountain Lion没有头文件sys/epoll.h.
我想在OS X上使用epoll功能.我如何使用epoll功能?
我正在使用GO检查一个进程(不是父进程)是否已经终止,基本上类似于FreeBSD中的pwait命令但是用go编写.
目前,我尝试了for loop一个kill -0,但我注意到,CPU的使用率是非常高的99%,使用这种方法,这里是代码:
package main
import (
"fmt"
"os"
"strconv"
"syscall"
"time"
)
func main() {
if len(os.Args) != 2 {
fmt.Printf("usage: %s pid", os.Args[0])
os.Exit(1)
}
pid, err := strconv.ParseInt(os.Args[1], 10, 64)
if err != nil {
panic(err)
}
process, err := os.FindProcess(int(pid))
err = process.Signal(syscall.Signal(0))
for err == nil {
err = process.Signal(syscall.Signal(0))
time.Sleep(500 * time.Millisecond)
}
fmt.Println(err)
}
Run Code Online (Sandbox Code Playgroud)
知道如何改进或正确实现这一点.
提前致谢.
UPDATE
sleep像建议的那样在循环内添加,有助于减少负载.
从提供的链接,似乎可以附加到现有的pid,我会尝试 …
好的:我正在iPhone OS应用程序中实现文件共享,当然这意味着文件系统监控.好极了!
基本上,当用户将文件操作到iTunes中的应用程序部分时,操作系统会复制和/或删除目录.因此,我需要通过像a这样的有效机制监视目录中的更改kqueue().
我如何实现这一点,以便我知道文件已完成复制?我在思考:
kqueue().但有没有更好的方法来确保我不会踩到操作系统的脚趾?
我正在使用Watchdog监视网络目录,非递归,以便随着时间的推移创建特定模式的文件.我看到的问题是,虽然我在本地测试时效果很好,但如果我从远程计算机更改受监控目录,则不会触发事件.
以下是我配置的具体细节:
使用stock示例代码段可以轻松复制我的问题示例:
import sys
import time
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
event_handler = LoggingEventHandler()
observer = Observer()
observer.schedule(event_handler, path=sys.argv[1], recursive=False)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
Run Code Online (Sandbox Code Playgroud)
如果在网络目录上启动它,然后从同一系统进行更改,则会调度事件.但是,如果您随后从网络上的另一台计算机更改目录,则不会调度任何事件.
我是否遗漏了关于kqueue限制的内容(或者可能是OSX上的FSEvents,因为它首先由Watchdog表示首选)?
我在这个python包上被激怒了,并且开始将它用于替换文件系统轮询的其他脚本,但我似乎无法找到有关我为何看到此问题的任何信息.
更新
我还测试了MacFSEvents并遇到了同样的问题.然后我修改了上面的测试脚本,强行尝试不同的观察者:
# does not work with remote changes
from watchdog.observers.fsevents import FSEventsObserver as Observer
# does not work with remote changes
from watchdog.observers.kqueue …Run Code Online (Sandbox Code Playgroud) 我发现有一些库可以监控mac上的文件更改,例如:https://github.com/bdkjones/VDKQueue 但是我找不到一个库来监控ios平台上的文件更改.
任何人都可以告诉我如何监视objc包装器中的文件更改.
谢谢
我写了并发应用程序,并发现了错误:
buildFdSets:文件描述符超出范围
我发现它是一个进程中文件描述符数量的操作系统限制,在我的FreeBSD中1024.这是极限select().我也了解到另一种方法:kqueue().
我的问题是:
kqueue()而不是select()在haskell程序?