… | |
… | |
1496 | semantics of C<ev_stat> watchers, which means that libev sometimes needs |
1496 | semantics of C<ev_stat> watchers, which means that libev sometimes needs |
1497 | to fall back to regular polling again even with inotify, but changes are |
1497 | to fall back to regular polling again even with inotify, but changes are |
1498 | usually detected immediately, and if the file exists there will be no |
1498 | usually detected immediately, and if the file exists there will be no |
1499 | polling. |
1499 | polling. |
1500 | |
1500 | |
|
|
1501 | =head3 Inotify |
|
|
1502 | |
|
|
1503 | When C<inotify (7)> support has been compiled into libev (generally only |
|
|
1504 | available on Linux) and present at runtime, it will be used to speed up |
|
|
1505 | change detection where possible. The inotify descriptor will be created lazily |
|
|
1506 | when the first C<ev_stat> watcher is being started. |
|
|
1507 | |
|
|
1508 | Inotify presense does not change the semantics of C<ev_stat> watchers |
|
|
1509 | except that changes might be detected earlier, and in some cases, to avoid |
|
|
1510 | making regular C<stat> calls. Even in the presense of inotify support |
|
|
1511 | there are many cases where libev has to resort to regular C<stat> polling. |
|
|
1512 | |
|
|
1513 | (There is no support for kqueue, as apparently it cannot be used to |
|
|
1514 | implement this functionality, due to the requirement of having a file |
|
|
1515 | descriptor open on the object at all times). |
|
|
1516 | |
|
|
1517 | =head3 The special problem of stat time resolution |
|
|
1518 | |
|
|
1519 | The C<stat ()> syscall only supports full-second resolution portably, and |
|
|
1520 | even on systems where the resolution is higher, many filesystems still |
|
|
1521 | only support whole seconds. |
|
|
1522 | |
|
|
1523 | That means that, if the time is the only thing that changes, you might |
|
|
1524 | miss updates: on the first update, C<ev_stat> detects a change and calls |
|
|
1525 | your callback, which does something. When there is another update within |
|
|
1526 | the same second, C<ev_stat> will be unable to detect it. |
|
|
1527 | |
|
|
1528 | The solution to this is to delay acting on a change for a second (or till |
|
|
1529 | the next second boundary), using a roughly one-second delay C<ev_timer> |
|
|
1530 | (C<ev_timer_set (w, 0., 1.01); ev_timer_again (loop, w)>). The C<.01> |
|
|
1531 | is added to work around small timing inconsistencies of some operating |
|
|
1532 | systems. |
|
|
1533 | |
1501 | =head3 Watcher-Specific Functions and Data Members |
1534 | =head3 Watcher-Specific Functions and Data Members |
1502 | |
1535 | |
1503 | =over 4 |
1536 | =over 4 |
1504 | |
1537 | |
1505 | =item ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval) |
1538 | =item ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval) |
… | |
… | |
1542 | =item const char *path [read-only] |
1575 | =item const char *path [read-only] |
1543 | |
1576 | |
1544 | The filesystem path that is being watched. |
1577 | The filesystem path that is being watched. |
1545 | |
1578 | |
1546 | =back |
1579 | =back |
|
|
1580 | |
|
|
1581 | =head3 Examples |
1547 | |
1582 | |
1548 | Example: Watch C</etc/passwd> for attribute changes. |
1583 | Example: Watch C</etc/passwd> for attribute changes. |
1549 | |
1584 | |
1550 | static void |
1585 | static void |
1551 | passwd_cb (struct ev_loop *loop, ev_stat *w, int revents) |
1586 | passwd_cb (struct ev_loop *loop, ev_stat *w, int revents) |
… | |
… | |
1564 | } |
1599 | } |
1565 | |
1600 | |
1566 | ... |
1601 | ... |
1567 | ev_stat passwd; |
1602 | ev_stat passwd; |
1568 | |
1603 | |
1569 | ev_stat_init (&passwd, passwd_cb, "/etc/passwd"); |
1604 | ev_stat_init (&passwd, passwd_cb, "/etc/passwd", 0.); |
1570 | ev_stat_start (loop, &passwd); |
1605 | ev_stat_start (loop, &passwd); |
|
|
1606 | |
|
|
1607 | Example: Like above, but additionally use a one-second delay so we do not |
|
|
1608 | miss updates (however, frequent updates will delay processing, too, so |
|
|
1609 | one might do the work both on C<ev_stat> callback invocation I<and> on |
|
|
1610 | C<ev_timer> callback invocation). |
|
|
1611 | |
|
|
1612 | static ev_stat passwd; |
|
|
1613 | static ev_timer timer; |
|
|
1614 | |
|
|
1615 | static void |
|
|
1616 | timer_cb (EV_P_ ev_timer *w, int revents) |
|
|
1617 | { |
|
|
1618 | ev_timer_stop (EV_A_ w); |
|
|
1619 | |
|
|
1620 | /* now it's one second after the most recent passwd change */ |
|
|
1621 | } |
|
|
1622 | |
|
|
1623 | static void |
|
|
1624 | stat_cb (EV_P_ ev_stat *w, int revents) |
|
|
1625 | { |
|
|
1626 | /* reset the one-second timer */ |
|
|
1627 | ev_timer_again (EV_A_ &timer); |
|
|
1628 | } |
|
|
1629 | |
|
|
1630 | ... |
|
|
1631 | ev_stat_init (&passwd, stat_cb, "/etc/passwd", 0.); |
|
|
1632 | ev_stat_start (loop, &passwd); |
|
|
1633 | ev_timer_init (&timer, timer_cb, 0., 1.01); |
1571 | |
1634 | |
1572 | |
1635 | |
1573 | =head2 C<ev_idle> - when you've got nothing better to do... |
1636 | =head2 C<ev_idle> - when you've got nothing better to do... |
1574 | |
1637 | |
1575 | Idle watchers trigger events when no other events of the same or higher |
1638 | Idle watchers trigger events when no other events of the same or higher |