inotify_read

(PECL inotify >= 0.1.2)

inotify_read从 inotify 实例读取事件

描述

inotify_read(resource $inotify_instance): array

从 inotify 实例读取 inotify 事件。

参数

inotify_instance

inotify_init() 返回的资源

返回值

一个 inotify 事件数组,如果没有任何事件待处理并且 inotify_instance 是非阻塞的,则返回 false。每个事件都是一个数组,包含以下键

  • wd 是由 inotify_add_watch() 返回的监控描述符
  • mask 是 事件 的位掩码
  • cookie 是一个唯一 ID,用于连接相关事件(例如 IN_MOVE_FROMIN_MOVE_TO
  • name 是文件的文件名(例如,如果监控目录中的文件被修改了)

参见

添加笔记

用户贡献的笔记 2 个笔记

qriff at hotmail dot com
10 年前
<?php

$wd_constants
= array(
1 => array('IN_ACCESS','文件被访问(读取)'),
2 => array('IN_MODIFY','文件被修改'),
4 => array('IN_ATTRIB','元数据改变(例如权限、修改时间等)'),
8 => array('IN_CLOSE_WRITE','以写入方式打开的文件被关闭'),
16 => array('IN_CLOSE_NOWRITE','没有以写入方式打开的文件被关闭'),
32 => array('IN_OPEN','文件被打开'),
128 => array('IN_MOVED_TO','文件被移动到被监视的目录中'),
64 => array('IN_MOVED_FROM','文件被移动出被监视的目录'),
256 => array('IN_CREATE','在被监视的目录中创建文件或目录'),
512 => array('IN_DELETE','在被监视的目录中删除文件或目录'),
1024 => array('IN_DELETE_SELF','被监视的文件或目录被删除'),
2048 => array('IN_MOVE_SELF','被监视的文件或目录被移动'),
24 => array('IN_CLOSE','等于 IN_CLOSE_WRITE | IN_CLOSE_NOWRITE'),
192 => array('IN_MOVE','等于 IN_MOVED_FROM | IN_MOVED_TO'),
4095 => array('IN_ALL_EVENTS','所有上述常量的位掩码'),
8192 => array('IN_UNMOUNT','包含被监视对象的 文件系统被卸载'),
16384 => array('IN_Q_OVERFLOW','事件队列溢出(此事件的 wd 为 -1)'),
32768 => array('IN_IGNORED','监视被删除(显式地通过 inotify_rm_watch() 或因为文件被删除或文件系统被卸载)'),
1073741824 => array('IN_ISDIR','此事件的主题是一个目录'),
1073741840 => array('IN_CLOSE_NOWRITE','高位:没有以写入方式打开的文件被关闭'),
1073741856 => array('IN_OPEN','高位:文件被打开'),
1073742080 => array('IN_CREATE','高位:在被监视的目录中创建文件或目录'),
1073742336 => array('IN_DELETE','高位:在被监视的目录中删除文件或目录'),
16777216 => array('IN_ONLYDIR','仅当 pathname 是目录时才监视它(自 Linux 2.6.15 起)'),
33554432 => array('IN_DONT_FOLLOW','如果 pathname 是符号链接,则不要取消引用它(自 Linux 2.6.15 起)'),
536870912 => array('IN_MASK_ADD','如果 pathname 已经存在,则为其添加事件到监视掩码(而不是替换掩码)。'),
2147483648 => array('IN_ONESHOT','监视 pathname 以获取一个事件,然后从监视列表中删除它。')
);

$path = $argv[1];

$fd = inotify_init();
stream_set_blocking($fd, 0);
$watch_descriptor = inotify_add_watch($fd, $path, IN_ALL_EVENTS);

$poll = 0;
while (
true) {
$ecount = 0;
$fcount = 0;
// 轮询排队的事件,这些事件在期间生成
// 因为 while (true) { } 有一些严重的副作用
sleep(5);
$poll++;
$events = inotify_read($fd);
if (
$events) $ecount = count($events);
echo
"=== ".date("Y-m-d H:i:s")." inotify 轮询 #$poll 包含 ".$ecount." 个事件";
if (
$events) echo ":";
echo
"\n";
if (
$events) {
foreach (
$events as $event) {
$fcount++;
echo
" inotify 事件 #".$fcount." - 对象: ".$event['name'].": ".$wd_constants[$event['mask']][0]." (".$wd_constants[$event['mask']][1].")\n";
}
}
}

inotify_rm_watch($fd, $watch_descriptor);

fclose($fd);

?>
lingtalfi
9 年前
一旦监视被读取,它就会从队列中删除。
(inotify_queue_len 将返回 0)
To Top