标签: kqueue

Mac OS X中的文件级文件系统更改通知

我希望在修改给定目录下(直接或间接)任何文件时通知我的代码.通过"修改",我的意思是我希望每当文件的内容被更改,重命名或删除时都会通知我的代码; 或者是否添加了新文件.对于我的应用程序,可能有数千个文件.

我看起来像FSEvents,但其技术概述部分地说:

需要注意的重点是通知的粒度在目录级别.它只告诉您目录中的某些内容已更改,但不会告诉您更改的内容.

它还说:

文件系统事件API也不是为了查找特定文件何时更改而设计的.出于这种目的,kqueues机制更合适.

但是,为了在给定文件上使用kqueue,必须打开文件以获取文件描述符.管理数千个文件描述符是不切实际的(并且可能会超过最大允许的打开文件描述符数).

奇怪的是,在Windows下,我可以使用该ReadDirectoryChangesW()功能,它正是我想要的.

那么如何在Mac OS X下做我想做的事情呢?或者,问另一种方式:如何ReadDirectoryChangesW()在用户空间中编写等效的Mac OS X(并且非常有效地执行此操作)?

macos readdirectorychangesw fsevents kqueue

28
推荐指数
2
解决办法
2万
查看次数

重新审视"你如何一起使用aio和epoll"

如何在单个事件循环中一起使用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()支持.晶莹剔透.像许多其他的东西.

posix epoll aio kqueue

11
推荐指数
1
解决办法
2568
查看次数

使用vim编写文件不会在OS X上触发文件更改事件

我正在使用监视程序监视OS X上的.less文件更改事件.如果我使用TextMate或Sublime Text更改.less文件的内容,则会捕获修改事件.但是,如果我使用vim编辑内容,则不会触发文件修改事件(但会捕获使用vim创建的文件的文件创建事件).我已经看到了与FSEvents和kqueue相同的行为(两者我几乎都不知道).

我想知道有人可以解释这种行为吗?

python macos watchdog fsevents kqueue

11
推荐指数
1
解决办法
1388
查看次数

监视文件更改的目录

我希望监视一个目录(数千个文件,大约有5个子目录级别),以便更改文件.我知道我可以使用FSEvents API监视目录,以便在该目录中更改文件,但我似乎无法弄清楚如何确定哪些文件发生了变化.这个引用建议我在每次触发事件时构建一个二叉树并遍历树,这是确定哪些文件被更改的最佳方法吗?如果没有,有什么更好的选择?

是否更好地递归扫描目录并将kqueue附加到每个文件?我不确定这对成千上万的文件有多好?

cocoa fsevents kqueue osx-lion

11
推荐指数
2
解决办法
4400
查看次数

OS X不支持epoll功能吗?

我正在学习使用epoll功能.但我的OS X,Mountain Lion没有头文件sys/epoll.h.

我想在OS X上使用epoll功能.我如何使用epoll功能?

macos epoll kqueue

10
推荐指数
1
解决办法
1万
查看次数

如何正确等待事件/流程完成不是父母?

我正在使用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,我会尝试 …

linux freebsd go kqueue

9
推荐指数
1
解决办法
724
查看次数

使用kqueue()监视目录中的更改的最佳方法是什么?

好的:我正在iPhone OS应用程序中实现文件共享,当然这意味着文件系统监控.好极了!

基本上,当用户将文件操作到iTunes中的应用程序部分时,操作系统会复制和/或删除目录.因此,我需要通过像a这样的有效机制监视目录中的更改kqueue().

我如何实现这一点,以便我知道文件已完成复制?我在思考:

  • 监控kqueue().
  • 在事件中,启动(或重置现有)超时.
  • 超时过后,请继续工作.

但有没有更好的方法来确保我不会踩到操作系统的脚趾?

iphone directory macos monitoring kqueue

8
推荐指数
1
解决办法
3295
查看次数

Watchdog(osx)未通知远程网络更改

我正在使用Watchdog监视网络目录,非递归,以便随着时间的推移创建特定模式的文件.我看到的问题是,虽然我在本地测试时效果很好,但如果我从远程计算机更改受监控目录,则不会触发事件.

以下是我配置的具体细节:

  • OSX
  • 在NFS挂载上监视单个目录,非递归
  • python 2.6

使用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)

python monitoring watchdog fsevents kqueue

7
推荐指数
1
解决办法
3619
查看次数

如何在iOS平台上监控文件更改?

我发现有一些库可以监控mac上的文件更改,例如:https://github.com/bdkjones/VDKQueue 但是我找不到一个库来监控ios平台上的文件更改.

任何人都可以告诉我如何监视objc包装器中的文件更改.

谢谢

file monitor kqueue ios

7
推荐指数
2
解决办法
5867
查看次数

Haskell在kqueue上的并发性

我写了并发应用程序,并发现了错误:

buildFdSets:文件描述符超出范围

我发现它是一个进程中文件描述符数量的操作系统限制,在我的FreeBSD1024.这是极限select().我也了解到另一种方法:kqueue().

我的问题是:

  • 如何赢取文件描述符的限制?
  • 如何使用kqueue()而不是select()在haskell程序?

concurrency haskell epoll kqueue

6
推荐指数
1
解决办法
563
查看次数